主页 > 开源代码  > 

Redis常用命令合集【二】

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

标签:

Redis常用命令合集【二】由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Redis常用命令合集【二】