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)

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

相关推荐
秃头摸鱼侠1 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck1 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机1 小时前
6. MySQL基本查询
数据库·mysql
�FENG1 小时前
Redis 安装配置和性能优化
redis·持久化
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩2 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩2 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang2 小时前
负载均衡LB》》HAproxy
运维·数据库·负载均衡
AI.NET 极客圈2 小时前
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
数据库·人工智能·.net