redis是key-value的存储格式,
key是string类型的,
value可以有五种基本的数据结构:string、hash、list、set、zset
来看看 这5中基本数据类型的基本使用和应用
一.字符串string
string是最常见和最基本的数据结构
基本使用:
(一).字符串常用的操作:
set key value // 存入字符串键值对
mset key value [key value ...] // 批量存入字符串键值对
get key //获取一个字符串的键值
mget key [key ... ] //批量获取字符串的键值
setnx key value // 存入一个不存在的字符串键值对 很重要很重要 用于分布式锁 存入成功返回1 失败返回0
del key [key...] 删除一个(多个)键
expire key senconds //设置一个键的过期时间 单位为秒
也可以综合性的写法:set strkey 2222 ex 20 nx // 当strkey 键不存在的时候,设置键为strkey 值为222的string键值对,过期时间是20s
(二).原子加减
incr key //将key中存储的数值加1
decr key //将key中存储的数值减1
ps:如果key对应的值不是数值,那么进行incr和decr会报错
incrby key increment //将key中存储的数值加increment
decrby key decrement //将key中存储的数值减decrement
(三).应用
1.单值缓存
set key value
get key
2.对象缓存
1)mset user:1:username enjoy user:1:passwd 123
mget user:1:username user:1:passwd
2)set user:1 json字符串 注意:json字符串不要过长,过长会引起大key问题
3.分布式锁
setnx product:1001 true // 返回1是获取锁成功
setnx product:1001 true // 返回0是获取锁失败
...//一些逻辑操作
del product:1001 //删除锁
或者直接使用 set product:1001 true ex 30 nx 这种综合性的写法 防止意外中止导致的死锁
4.计数器
计算文章的阅读量:incr article:1001:readCount
get article:1001:readCount
5.Web集群session共享
6.分布式系统全局序列号
incrby orderId 10000
二.哈希Hash
(一).哈希常用的操作:
hset key field value //设置哈希表key的一个键值
hmset key field value [field value ...] //设置哈希表key的多个键值
hget key field //获得哈希表key的键值
hmget key field [field ...] //获得哈希表key的多个键值
hsetnx key field value //存储一个不存在的哈希表key的键值
hdel key field [field1... ]//删除哈希表key中的field键值
hlen key //返回哈希表key中field的数量
hgetall key //返回哈希表key中所有的键值
hincrby key field increment //为哈希表key中field键的值加上增量increment
ps:Hash的缺点:过期功能不能用在field上,只能用在key上
集群架构下不适合大规模使用
如果一个对象的字段太多,可能会引起大key问题(又是大key问题)
(二).哈希应用:
1对象缓存 2电商购物车
电商购物车:
a 添加商品:hset cart:1001 10086 1 (cart:1001是键 1001指的是userID 10086指的是商品的id 1是商品数量)
b 增加商品数量:hincrby cart:1001 10086 2 //购物车中商品10086的数量加2
c 删除商品:hdel cart:1001 10086
d 商品总数:hlen cart:1001
e 全部商品:hgetall cart:1001
ps:如果忘了命令,也可以使用help @hash来查看对应的命令,如下:
三.列表List
(一).列表常用的操作:
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key //移除并返回key列表的头元素
RPOP key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待(注意:timeout 不是说默认就为0了,得需要显式的写出来)
(二).列表的应用:
1 .当我们在分布式架构中无法实现共享的一个数据结构(栈,队列,阻塞队列)的时候 ,就可以用redis中的list
栈stack:lpush+lpop(先进后出)
队列(queue):lpush + rpop (先进先出)
阻塞队列(BlockingQueue):lpush + brpop (先进先出)
2.微信朋友圈、公众号等的消息流(有时间线的消息流):查看最近的消息
比如用户1001关注了大V车哥说车、小林Coding的公众号
当车哥说车发了一个,消息的id是21
lpush msg:1001 21
当车哥说车发了一个消息,消息的id是22
lpush msg:1001 22
那么用户在查看公众号的时候:
lrange msg:1001 0 2
四.集合Set
(一).集合常用的操作:
sadd key member [members...] //往集合key中添加元素
smembers key //查看集合key中的所有元素
srem key member [member ...] //删除集合key中的元素
scard key //查看集合key中的元素个数
sismember key member //查看member是不是集合key中的元素,不是返回0 ,是则返回1
srandmember key [count] //从集合key中返回count(count默认 为1)个元素,元素并不从集合中删除
spop key [count] //从集合key中返回count(count默认 为1)个元素,元素从集合中删除
应用:
1.微信小程序抽奖:
点击“参加抽奖” sadd act:1001 userId_01
查看参加抽奖的人 : smembers act:1001
进行抽奖(3个人可以抽到奖品):spop act:1001 3 或者srandmember act:1001 3
2.微信的点赞收藏
点赞:sadd like:{消息ID} userId
取消点赞: srem like:{消息ID} userId
查看用户是否点过赞: sismember like:{消息ID} userId
获取点赞列表 :smembers like:{消息ID}
获取点赞用户数:scard like:{消息ID}
(二)Set运算操作
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
说明:
SINTER set1 set2 set3 -> { c } 交集
SUNION set1 set2 set3 -> { a,b,c,d,e } 并集
SDIFF set1 set2 set3 -> { a } 差集:以set1为主,相当于set1减去set2和set3的并集
应用:微博微信的关注模型、集合操作电商平台筛选商品等等
比如我关注了甄嬛,安陵容,浣碧
MeSet:{zhenhuan,anlingrong, huanbi}
皇上关注的人:皇后,华妃,甄嬛
HuangshangSet:{huanghou,huafei,zhenhuan}
当我进入了皇上的主页的时候:
会显示:
我和皇上的共同关注:sinter MeSet HuangshangSet ->{zhenhuan}
我关注的人也关注他(皇上):sismember zhenhuanSet Huangshang
sismember anlingrongSet Huangshang
sismember huanbiSet Huangshang
我可能认识的人(简单的关注推荐):sdiff HuangshangSet MeSet
五.有序集合ZSet
可以使用help@sorted_set帮助来查看该命令的使用
127.0.0.1:6379> help @sorted_set
BZPOPMAX key [key ...] timeout
summary: Remove and return the member with the highest score from one or more sorted sets, or block until one is available
since: 5.0.0
BZPOPMIN key [key ...] timeout
summary: Remove and return the member with the lowest score from one or more sorted sets, or block until one is available
since: 5.0.0
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
summary: Add one or more members to a sorted set, or update its score if it already exists
since: 1.2.0
ZCARD key
summary: Get the number of members in a sorted set
since: 1.2.0
ZCOUNT key min max
summary: Count the members in a sorted set with scores within the given values
since: 2.0.0
ZDIFF numkeys key [key ...] [WITHSCORES]
summary: Subtract multiple sorted sets
since: 6.2.0
ZDIFFSTORE destination numkeys key [key ...]
summary: Subtract multiple sorted sets and store the resulting sorted set in a new key
since: 6.2.0
ZINCRBY key increment member
summary: Increment the score of a member in a sorted set
since: 1.2.0
ZINTER numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
summary: Intersect multiple sorted sets
since: 6.2.0
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Intersect multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
ZLEXCOUNT key min max
summary: Count the number of members in a sorted set between a given lexicographical range
since: 2.8.9
ZMSCORE key member [member ...]
summary: Get the score associated with the given members in a sorted set
since: 6.2.0
ZPOPMAX key [count]
summary: Remove and return members with the highest scores in a sorted set
since: 5.0.0
ZPOPMIN key [count]
summary: Remove and return members with the lowest scores in a sorted set
since: 5.0.0
ZRANDMEMBER key [count [WITHSCORES]]
summary: Get one or multiple random elements from a sorted set
since: 6.2.0
ZRANGE key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
summary: Return a range of members in a sorted set
since: 1.2.0
ZRANGEBYLEX key min max [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range
since: 2.8.9
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score
since: 1.0.5
ZRANGESTORE dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]
summary: Store a range of members from sorted set into another key
since: 6.2.0
ZRANK key member
summary: Determine the index of a member in a sorted set
since: 2.0.0
ZREM key member [member ...]
summary: Remove one or more members from a sorted set
since: 1.2.0
ZREMRANGEBYLEX key min max
summary: Remove all members in a sorted set between the given lexicographical range
since: 2.8.9
ZREMRANGEBYRANK key start stop
summary: Remove all members in a sorted set within the given indexes
since: 2.0.0
ZREMRANGEBYSCORE key min max
summary: Remove all members in a sorted set within the given scores
since: 1.2.0
ZREVRANGE key start stop [WITHSCORES]
summary: Return a range of members in a sorted set, by index, with scores ordered from high to low
since: 1.2.0
ZREVRANGEBYLEX key max min [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings.
since: 2.8.9
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score, with scores ordered from high to low
since: 2.2.0
ZREVRANK key member
summary: Determine the index of a member in a sorted set, with scores ordered from high to low
since: 2.0.0
ZSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate sorted sets elements and associated scores
since: 2.8.0
ZSCORE key member
summary: Get the score associated with the given member in a sorted set
since: 1.2.0
ZUNION numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
summary: Add multiple sorted sets
since: 6.2.0
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Add multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
常用:
zadd key score member [score member ...]
ZRANGE key 0 -1 WITHSCORES //显示所有成员及其 score 值
zincrby key increment member //为有序集 key 的成员 member 的 score 值加上增量 increment
应用1:我在抖音直播间中参数抽奖,我和主播互动多或者我点赞点的多或者给直播间刷礼物较多都会有更大的中奖概率,用set的话就不能实现这样的功能,但是zset可以
点击参加抽奖活动 zadd act:{直播间号} 0 userId
和主播互动一次:zincrby act:{直播间号} 1 userId
给主播刷礼物:zincrby act:{直播间号} 10 userId
当到了时间抽奖的时候用:zpopmax act:{直播间号} 1
应用2:排行榜
--------------------高性能原理剖析---------------------
一. redis为什么这么快?
1.redis是基于内存的操作,如果把redis做了强持久化的话,性能会大大下降。
2.redis采用了IO多路复用的方式。
3.单线程,省去了上下文切换的时间。
4.底层的丰富高效的数据存储结构。
说说底层的数据存储:底层是全局哈希表
key是string类型的,但是value值的类型是很多的。
为什么有些+1就可以,有些字符+1就报错呢?
type key
object encoding key
两个命令是查看底层的存储数据类型
ps:redis是单线程的吗?不是的,单线程仅仅指的是读取网络IO与执行redis命令的线程是单线程的。
可以用redis下的src中的redis-benchmark进行压测
代表我的这台机器的redis的get的qps是33898.30/s
二.查看最大的连接数 maxclients 默认是10000
这个数值可以在redis.conf中修改
三.redis中的一些高阶命令:
keys *
keys * 是扫描全库的,如果redis中key很多,那么这个命令会很慢的
如果keys*执行需要几秒钟的话,那么后面排队的命令都需要进行阻塞,这样是不可以的,尽量少用或者不用 有个命令叫做scan,这个时候就派上用场了,刚开始的时候cursor需要是0
count 3 这个代表的是大概返回是3条数据,不一定是3条数据,像上图中返回的是四条数据
第二次扫描的cursor应该是上一次返回的数值,直到返回的游标是0,那么就相当于所有的遍历都结束了。
但是scan并非完美,可能扫描的过程中有增删改,就会导致有些数据少查或者是多查,实际开发中一定要考虑到对应的问题。