Redis常见数据类型(6)-set, zset

目录

Set

命令小结

内部编码

使用场景

用户画像

其它

Zset有序集合

普通指令

zadd

zcard

zcount

zrange

zrevrange

​编辑

zrangebyscore

zpopmax/zpopmin

bzpopmax/bzpopmin

zrank/zrevrank

zscore

zrem

zremrangebyrank

zremrangebyscore


Set

命令小结

|-----------------------------------|------------------|---------------------|
| 命令 | 功能 | 时间复杂度 |
| 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 | 在集合中随机获取count个元素 | O(count) |
| spop key count | 在集合中随机删除count个元素 | O(count) |
| smembers key | 获取集合中的所有元素 | O(k), k是元素个数 |
| sinter key key... sinterstore | 求多个集合的交集 | O(m * k) |
| sunion key key... sunionstore | 求多个集合的并集 | O(k), k是多个集合元素个数的总和 |
| sdiff key key... sdiffstore | 求多个集合的差集 | O(k), k是多个集合元素个数的总和 |

内部编码

集合中的内部编码有两种:

intset(整数集合): 当集合中的元素都是整数并且元素的个数小于set-max-intset-entires配置时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用.

hashtable(哈希表): 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现.

使用场景

用户画像

集合类型比较典型的使用场景就是用户画像, 例如在抖音中, 用户A对美女跳舞, 唱跳rap篮球感兴趣, 用户B对历史, 二次元游戏感兴趣, 那么这些特征就会被记录为用户画像, 这些数据对提升用户体验和用户黏度就非常有帮助.

其它

在社交软件中查找共同好友. 以及互联网产品中衡量用户量, 用户规模非常有帮助(主要是按照浏览量等指标来确定, 如果同一个用户多次访问, 就会去重访问信息, 这样有助于准确地提供用户规模等信息).

Zset有序集合

简而言之, 它还是一种集合, 但是与集合不同, 它在里面引入了一个浮点类型 -- 分数(score)这个概念, 我们可以通过这个分数作为排序依据, 使其有序(之前如list中是使用下标的概念).

比如我们按照伤害对如下植物进行排序:

有序集合提供了指定分数和元素的范围查找, 计算成员排名等功能, 合理利用有序集合, 能解决很多问题.

普通指令

zadd

功能: 添加或者更新指定的元素以及关联的分数到zset中, 分数应该符合double类型.

语法:

zadd key nx \| xx gt \| lt ch incr score member score member... (注: 分数可重复)

相关选项介绍:

xx|nx: xx仅仅用于更新存在的元素, 不添加新元素; nx可以更新未存在的元素(不写默认为nx)

gt | lt : 如果要更新分数, 发现比现在给定的分数大(小), 此时就更新成功, 否则不更新.

ch: 默认情况下, zadd返回的是本次添加的元素个数, 但指定这个选项之后, 就会还包含本次更新的元素个数.

incr: 此时命令类似zincrby 的效果, 将元素分数加上指定的分数, 此时只能指定一个元素/分数.

时间复杂度: O(logN): 因为要找到插入元素的位置, 就会使用类似二分查找这种方式寻找.

返回值: 本次添加的元素个数.

其余参数可以自行测试.

zcard

功能: 获取zset中的元素数目.

语法:

zcard key

返回值: zset中的元素个数.

zcount

功能: 返回分数在min和max之间的元素个数, 默认情况下, min和max都是包含的, 可以通过 ( 排除.即一般情况下为闭区间, 使用(的那个数字的那个部分是开区间.

语法:

zcount key min max

时间复杂度: O(logN), 因为实际上在Zset内能够得知元素的位次, 因此我们只需要定位到min和max的位次, 然后相减即可.

返回值: 满足条件的元素列表个数

zrange

功能: 返回指定区间里的元素, 分数按照升序排序. 带上withscores可以把分数也返回.

语法:

zrange key start stop withscores

此处的start, stop为下标构成的区间, 从0开始, 支持负数.

时间复杂度: O(logN + M), 先找到start/ stop, 然后M是指start与stop之间的元素数目.

返回值: 区间里的元素列表.

zrevrange

功能: 返回指定区间里的元素, 分数按降序排序, 带上withscores也可以将分数返回.

语法:

zrevrange key start stop withscores

时间复杂度: O(logN + M)

返回值: 区间元素列表.

zrangebyscore

返回分数在min, max之间的元素, 默认情况下, min和max都是包含的, 可以通过 ( 排除.

语法:

zrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 区间的元素列表

zpopmax/zpopmin

删除并返回分数最高/低的count个元素.

语法:

zpopmax/zpopmin key count

时间复杂度: O(logN * M) N是有序集合数目, M是要删除数目, 虽然我们记录了次序, 但我们是通过M次普通删除(每次删一个), 因此时间复杂度是这个.

返回值: 分数和元素列表.

bzpopmax/bzpopmin

功能: zpopmax/zpopmin阻塞版本.

语法:

bzpopmax/bzpopmin key key... timeout

时间复杂度: O(N)

zrank/zrevrank

功能: 返回指定元素的排名, 升序/降序.

语法:

zrank/zrevrank key member

时间复杂度: O(logN)

返回值, 排名.

zscore

功能: 返回指定元素的分数.

语法:

zscore key member

时间复杂度: O(1)

返回值: 分数

zrem

功能: 删除指定元素.

语法:

zrem key member member...

时间复杂度: O(M * logN)

返回值: 本次操作删除的元素个数.

zremrangebyrank

功能: 按照排序, 升序删除指定范围的元素, 左闭右闭.

语法:

zremrangebyrank key start stop

时间复杂度: O(logN + M)

返回值: 本次操作的元素个数.

zremrangebyscore

功能: 按照分数删除指定范围的元素, 左闭右闭.

语法

zremrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 本次操作删除的元素数目.

相关推荐
小马爱打代码7 小时前
Redis 集群方案详解:主从复制、哨兵、脑裂、分片集群和哈希槽
数据库·redis·哈希算法
海南java第二人9 小时前
ClickHouse 稀疏索引深度解析:为什么 OLAP 数据库不用 B-Tree?
数据库·clickhouse
Litluecat9 小时前
信创迁移:Oracle切换海量数据库,慢sql扫描
数据库·sql·oracle·信创·海量
消失在人海中9 小时前
Oracle的CURRENT REDO丢失,数据丢失风险分析
数据库·oracle
喵了几个咪9 小时前
选择第三方IAM还是自建权限体系?中小型后台系统权限架构决策指南
数据库·oracle·架构
Elastic 中国社区官方博客10 小时前
Kibana:使用 AI Chat 及 MCP 轻松创建 AI 原生仪表板
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·信息可视化
杨云龙UP11 小时前
Oracle Health Check巡检脚本使用SOP V2.0:从HTML原始报告→生成Word专业巡检报告→交付客户_2026-06-03
linux·运维·数据库·sql·oracle·报告·巡检
Database_Cool_11 小时前
Hudi 湖仓一体架构:阿里云 AnalyticDB MySQL 原生集成最佳实践
数据库·mysql·阿里云
我是一颗柠檬12 小时前
【Redis】发布订阅与消息队列Day8(2026年)
数据库·redis·后端·缓存