Redis常用命令合集【二】
在合集【一】中已经介绍了redis中String类型和Hash类型,接下来就继续介绍剩下的List、Set、SortedSet类型。
1.List类型
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
-
有序
-
元素可以重复
-
插入和删除快
-
查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
List的常见命令有:
-
LPUSH key element ... :向列表左侧插入一个或多个元素
-
LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
-
RPUSH key element ... :向列表右侧插入一个或多个元素
-
RPOP key:移除并返回列表右侧的第一个元素
-
LRANGE key star end:返回一段角标范围内的所有元素
-
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
示例:
# 1. LPUSH(左侧插入元素)
LPUSH comments:post123 "Good post!" "Nice!" # 从左侧插入两个元素,列表顺序变为 ["Nice!", "Good post!"]
LPUSH comments:post123 "First comment" # 继续左侧插入,变为 ["First comment", "Nice!", "Good post!"]
# 2. LPOP(左侧移除元素)
LPOP comments:post123 # 返回 "First comment",列表剩余 ["Nice!", "Good post!"]
LPOP empty_list # 返回 (nil)(空列表无元素可移除)
# 3. RPUSH(右侧插入元素)
RPUSH comments:post123 "Thanks!" # 从右侧插入,列表变为 ["Nice!", "Good post!", "Thanks!"]
RPUSH comments:post123 "Last one" "Final" # 右侧批量插入两个元素,变为 ["Nice!", "Good post!", "Thanks!", "Last one", "Final"]
# 4. RPOP(右侧移除元素)
RPOP comments:post123 # 返回 "Final",列表剩余 ["Nice!", "Good post!", "Thanks!", "Last one"]
RPOP comments:post123 # 返回 "Last one",列表剩余 ["Nice!", "Good post!", "Thanks!"]
# 5. LRANGE(范围查询)
LRANGE comments:post123 0 -1 # 返回列表所有元素:1) "Nice!" 2) "Good post!" 3) "Thanks!"
LRANGE comments:post123 1 2 # 返回索引1到2的元素:1) "Good post!" 2) "Thanks!"
LRANGE comments:post123 5 10 # 返回空列表(超出范围)
# 6. BLPOP/BRPOP(阻塞式弹出)
# 窗口1执行(阻塞等待):
BLPOP new_tasks 30 # 等待30秒,若new_tasks列表无元素,则超时返回nil
# 窗口2插入元素后(立即返回):
LPUSH new_tasks "task1" # 窗口1立即返回:1) "new_tasks" 2) "task1"
2.Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
-
无序
-
元素不可重复
-
查找快
-
支持交集、并集、差集等功能
Set的常见命令有:
-
SADD key member ... :向set中添加一个或多个元素
-
SREM key member ... : 移除set中的指定元素
-
SCARD key: 返回set中元素的个数
-
SISMEMBER key member:判断一个元素是否存在于set中
-
SMEMBERS:获取set中的所有元素
-
SINTER key1 key2 ... :求key1与key2的交集
示例:
# 1. SADD(添加元素到集合)
SADD user:A:followings "user:B" "user:C" "user:D" # 添加3个关注用户(返回 3)
SADD user:A:followings "user:B" # 重复元素不添加(返回 0)
SADD user:B:followers "user:A" "user:C" "user:E" # 设置用户B的粉丝集合
# 2. SREM(移除集合元素)
SREM user:A:followings "user:D" # 移除一个元素(返回 1)
SREM user:A:followings "user:X" # 移除不存在的元素(返回 0)
# 3. SCARD(获取元素数量)
SCARD user:A:followings # 返回 2(当前元素:"user:B", "user:C")
SCARD non_existing_set # 返回 0
# 4. SISMEMBER(判断元素是否存在)
SISMEMBER user:A:followings "user:B" # 返回 1(存在)
SISMEMBER user:A:followings "user:E" # 返回 0(不存在)
# 5. SMEMBERS(获取所有元素)
SMEMBERS user:A:followings # 返回 1) "user:B" 2) "user:C"(无序)
SMEMBERS user:B:followers # 返回 1) "user:A" 2) "user:C" 3) "user:E"
# 6. SINTER(求交集)
SINTER user:A:followings user:B:followers # 返回共同元素:1) "user:B"被移除后,交集为 "user:C"
例如两个集合:s1和s2:
求交集:SINTER s1 s2
求s1与s2的不同:SDIFF s1 s2
练习:
-
将下列数据用Redis的Set集合来存储:
-
张三的好友有:李四、王五、赵六
-
李四的好友有:王五、麻子、二狗
-
利用Set的命令实现下列功能:
-
计算张三的好友有几人
-
计算张三和李四有哪些共同好友
-
查询哪些人是张三的好友却不是李四的好友
-
查询张三和李四的好友总共有哪些人
-
判断李四是否是张三的好友
-
判断张三是否是李四的好友
-
将李四从张三的好友列表中移除
# ===== 1. 数据存储 =====
# 存储张三的好友列表
SADD zhangsan:friends "李四" "王五" "赵六"
# 存储李四的好友列表
SADD lisi:friends "王五" "麻子" "二狗"
# ===== 2. 功能实现与验证 =====
# 2.1 计算张三的好友数量
SCARD zhangsan:friends # 预期返回 3
# 2.2 计算张三和李四的共同好友
SINTER zhangsan:friends lisi:friends # 预期返回 1) "王五"
# 2.3 查询张三独有好友(张三有但李四无)
SDIFF zhangsan:friends lisi:friends # 预期返回 1) "李四" 2) "赵六"
# 2.4 查询两人所有好友(去重合并)
SUNION zhangsan:friends lisi:friends # 预期返回 5 个元素:李四、王五、赵六、麻子、二狗
# 2.5 判断李四是否是张三的好友
SISMEMBER zhangsan:friends "李四" # 预期返回 1(存在)
# 2.6 判断张三是否是李四的好友
SISMEMBER lisi:friends "张三" # 预期返回 0(不存在)
# 2.7 将李四从张三的好友列表中移除
SREM zhangsan:friends "李四" # 预期返回 1(成功移除)
3.SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
SortedSet具备下列特性:
-
可排序
-
元素不重复
-
查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令有:
-
ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
-
ZREM key member:删除sorted set中的一个指定元素
-
ZSCORE key member : 获取sorted set中的指定元素的score值
-
ZRANK key member:获取sorted set 中的指定元素的排名
-
ZCARD key:获取sorted set中的元素个数
-
ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
-
ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
-
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
-
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
-
ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:
-
升序获取sorted set 中的指定元素的排名:ZRANK key member
-
降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber
练习题:
将班级的下列学生得分存入Redis的SortedSet中:
Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76
并实现下列功能:
-
删除Tom同学
-
获取Amy同学的分数
-
获取Rose同学的排名
-
查询80分以下有几个学生
-
给Amy同学加2分
-
查出成绩前3名的同学
-
查出成绩80分以下的所有同学
# 将学生分数存入SortedSet
ZADD scores 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
# 删除Tom同学
ZREM scores Tom
# 获取Amy同学的分数
ZSCORE scores Amy
# 获取Rose同学的排名(按分数从高到低排名,0表示第一名)
ZREVRANK scores Rose
# 查询80分以下学生数量
ZCOUNT scores -inf (80
# 给Amy同学加2分
ZINCRBY scores 2 Amy
# 查出成绩前3名同学(带分数)
ZREVRANGE scores 0 2 WITHSCORES
# 查出80分以下所有同学(带分数)
ZRANGEBYSCORE scores -inf (80 WITHSCORES