【Redis】set 和 zset 类型的介绍和常用命令

1. set

1.1 介绍

set 类型和 list 不同的是,存储的元素是无序的,并且元素不允许重复,Redis 除了支持集合内的增删查改操作,还支持多个集合取交集,并集,差集

1.2 常用命令

|------------------------------------|----------------------|------------------------------------------|
| 命令 | 介绍 | 时间复杂度 |
| sadd key element [element ...] | 将一个或多个元素添加到指定的集合中 | O (k),k 是要添加的元素个数 |
| srem key element [element ...] | 从指定集合中移除一个或多个元素 | O (k),k 是要移除的元素个数 |
| scard key | 获取指定集合中的元素数量 | O (1) |
| sismember key element | 判断指定元素是否存在于集合中 | O (1) |
| srandmember key [count] | 从指定集合中随机返回一个或多个元素 | O (n),n 是count的值 |
| spop key [count] | 从指定集合中随机移除并返回一个或多个元素 | O (n),n 是count的值。 |
| smembers key | 获取指定集合中的所有元素。 | O (k),k 是集合中的元素个数 |
| sinter key [key ...] sinterstore | 求多个集合的交集 | O (m * k),k 是几个集合中元素最小的个数,m 是参与交集计算的键个数 |
| sunion key [key ...] sunionstore | 求多个集合的并集 | O (k),k 是多个集合的元素个数总和 |
| sdiff key [key ...] sdiffstore | 求多个集合的差集 | O (k),k 是多个集合的元素个数总和 |

1.3 内部编码

intset:当集合中的所有元素都是整数,并且元素数量较少时会使用intset编码来存储集合

hashtable:当集合中的元素不满足intset的条件,会使用hashtable编码来存储集合

1.4 应用场景

用户标签:为用户、商品等实体打标签,每个实体对应一个 Set,标签作为 Set 中的元素。

去重:在处理大量数据时,经常需要去除重复元素。例如在日志分析中,记录用户的访问 IP 地址,使用 Set 可以自动对 IP 进行去重,保证每个 IP 只被记录一次。

2. zset

2.1 介绍

zset 保留了 set 集合中不能有重复成员的特点,与之不同的是,zset 中的元素是有序的,集合中的每一个元素都有一个唯一的浮点类型的分数(score)与之关联,依次来进行排序,使得有序集合中的元素可以维护有序性,虽然集合中的元素是不能重复的,但是分数允许重复。

2.2 常用命令

|-------------------------------------------------|-----------------------------------------------|------------------------------------------------------------------|
| 命令 | 介绍 | 时间复杂度 |
| zadd key score member [score member ...] | 向有序集合中添加一个或多个成员,以及成员对应的分值 | O (k * log (n)),k 是添加成员的个数,n 是当前有序集合的元素个数 |
| zcard key | 获取有序集合的成员数量 | O (1) |
| zscore key member | 获取有序集合中指定成员的分值 | O (1) |
| zrank key member | 返回有序集合中指定成员的排名(从 0 开始,按分值从小到大排序) | O (log (n)),n 是当前有序集合的元素个数 |
| zrevrank key member | 返回有序集合中指定成员的排名(从 0 开始,按分值从大到小排序) | O (log (n)),n 是当前有序集合的元素个数 |
| zrem key member [member ...] | 移除有序集合中的一个或多个成员 | O (k * log (n)),k 是删除成员的个数,n 是当前有序集合的元素个数 |
| zincrby key increment member | 为有序集合中指定成员的分值加上增量 increment | O (log (n)),n 是当前有序集合的元素个数 |
| zrange key start end [withscores] | 按分值从小到大返回有序集合中指定区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zrevrange key start end [withscores] | 按分值从大到小返回有序集合中指定区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zrangebyscore key min max [withscores] | 按分值从小到大返回有序集合中指定分值区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zrevrangebyscore key max min [withscores] | 按分值从大到小返回有序集合中指定分值区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zcount key min max | 计算有序集合中指定分值区间内成员的数量 | O (log (n)),n 是当前有序集合的元素个数 |
| zremrangebyrank key start end | 按排名删除有序集合中指定区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zremrangebyscore key min max | 按分值删除有序集合中指定分值区间内的成员 | O (k + log (n)),k 是获取成员的个数,n 是当前有序集合的元素个数 |
| zinterstore destination numkeys key [key ...] | 计算给定的一个或多个有序集合的交集,并将结果存储在新的有序集合 destination 中 | O (n * k) + O (m * log (m)),n 是输入集合最小的元素个数,k 是集合个数,m 是目标集合元素个数 |
| zunionstore destination numkeys key [key ...] | 计算给定的一个或多个有序集合的并集,并将结果存储在新的有序集合 destination 中 | O (n) + O (m * log (m)),n 是输入集合总元素个数,m 是目标集合元素个数 |

2.3 内部编码

ziplist:如果有序集合中的元素个数较少,或者单个元素体积较小,就使用 ziplist 存储

skiplist:如果元素个数较多或者单个元素体积较大,使用 skiplist 存储

2.4 应用场景

基于 zset 有序的特点,可以用到很多场景中:

  1. 排行榜系统:比如游戏中的玩家排行榜,以玩家的积分作为分值,玩家昵称作为成员,能按分值(积分)对玩家进行排序,快速获取排名靠前或特定区间的玩家信息;视频平台的视频热度排行榜,以视频的播放量、点赞数等综合指标作为分值,视频 ID 作为成员,展示热门视频。
  2. 计分系统:在在线考试系统中,以考生的考试成绩作为分值,考生 ID 作为成员,可方便统计成绩排名、获取特定分数段的考生信息。
相关推荐
大厂技术总监下海11 分钟前
用户行为分析怎么做?ClickHouse + 嵌套数据结构,轻松处理复杂事件
大数据·数据结构·数据库
alonewolf_9921 分钟前
深入理解MySQL事务与锁机制:从原理到实践
android·数据库·mysql
朝依飞38 分钟前
fastapi+SQLModel + SQLAlchemy2.x+mysql
数据库·mysql·fastapi
3***g2051 小时前
redis连接服务
数据库·redis·bootstrap
m0_598177231 小时前
SQL 方法函数(1)
数据库
oMcLin1 小时前
如何在Oracle Linux 8.4上通过配置Oracle RAC集群,确保企业级数据库的高可用性与负载均衡?
linux·数据库·oracle
信创天地1 小时前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务
胖咕噜的稞达鸭1 小时前
进程间的通信(1)(理解管道特性,匿名命名管道,进程池,systeam V共享内存是什么及优势)重点理解代码!
linux·运维·服务器·数据库
德彪稳坐倒骑驴1 小时前
Sqoop入门常用命令
数据库·hadoop·sqoop
雪域迷影1 小时前
MacOS中安装并配置Redis
redis·macos·策略模式