当前位置: 首页 > article >正文

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

练习:

  1. 将下列数据用Redis的Set集合来存储:

  • 张三的好友有:李四、王五、赵六

  • 李四的好友有:王五、麻子、二狗

  1. 利用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


http://www.kler.cn/a/553243.html

相关文章:

  • Docker 实战应用
  • 使用QT读取文件,生成json文件
  • 如何在Windows下使用Ollama本地部署DeepSeek R1
  • wend看源码-(RAG工程)tiny-GraphRAG
  • MySQL 的存储引擎简介
  • STAR: 利用时空注意力机制和动态频率损失的视频超分辨率增强框架
  • 《数组》学习——长度最小的子数组
  • 【组态PLC】基于西门子s7-200和博图v16组态王16停车厂带烟雾报警【含PLC组态源码 M004期】
  • 数据结构(Java版)第十一期:栈和队列(二)
  • 机器学习·文本数据读写处理
  • 初步安装和使用vant组件库,使用css变量定制vant主题样式 ,小程序的API Promise化,调用promise化之API
  • Chrome Edge 开启多线程下载
  • Windows 环境下配置多个不同版本的 Maven
  • 使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF
  • SV刷题小记2
  • DeepSeek和ChatGPT在科研课题设计和SCI论文写作中的应用
  • PyTorch 基础知识
  • Java项目面试遇见试题总结
  • java常见面试场景题
  • Goutte库的使用方法详解