set
集合:
- 唯一
- 无序。(顺序不重要)孙行者、行者孙==>同一只猴
list
- 有序。(顺序很重要)孙行者、行者孙==>不同的猴
zset
- 有序。升序/降序
有序集合
排序的规则是什么?
- 给
zset
中的member
引入了一个属性——分数(score
),浮点类型 - 每个
member
都会安排一个分数
进行排序的时候,就是依照此处的分数大小,来进行升序/降序排序
- 分数就是:“武力值“
zset
中的 member
仍然要求是唯一的,score
可以重复
zset
主要还是用来存 member
的,score
只是辅助,进行排序
ZADD
使用 zadd
往有序集合中,添加元素
语法:
redis">ZADD key [NX | XX] [GT | CH] [INCR] score member [score member ...]ZRANGE key start end [withscores]
- 时间复杂度: O ( l o g N ) O(logN) O(logN), N N N 为有序集合中的元素个数
- 添加的时候,既要添加元素,又要添加分数。
member
和score
称为是一个“pair
”- 不要把
member
和score
理解成“键值对”(key-value
pair
)。键值对中,是有明确的“角色区分”,谁是键,谁是值,是明确的,一定是根据键找到值
- 不要把
XX
:只会更新已经存在的元素,不会添加新元素NX
:只能添加新元素,不会更新已经存在的元素- 都不加
- 如果当前的
member
不存在,此时就会达到“添加新member
”的效果 - 如果当前
member
已经存在,此时就会更新分数
- 如果当前的
LT
(less than
):更新分数的时候,要是添加的分数比之前的分数小,此时就更新,否则就不更新GT
(greater than
):和LG
相反
CH
(changed
):针对返回值进行描述,影响到zadd
的返回值- 本来
zadd
返回的是新增的元素个数 - 加了
CH
之后,还会告诉我们修改后的元素个数
- 本来
INCR
:能够针对现有元素的分数进行运算
zset
内部实际上就是按照升序方式来排列的
新增
- 查询结果降序
修改
如果修改的分数,影响到了之前的顺序,救护级自动移动之前的位置,保证是降序排序
ZCARD
获取一个 zset
的计数,即元素个数
语法:
redis">ZCARD key
- 返回值:
zset
内的元素个数
ZCOUNT
返回分数在 min
和 max
之间元素的个数,默认情况下 min
和 max
都是包含的,可以通过 ()
排除
语法:
redis">ZCOUNT key min max
-
时间复杂度: O ( l o g N ) O(logN) O(logN)
- 先根据
min
找到对应的元素, l o g ( N ) log(N) log(N) - 再根据
max
找到对应的元素, l o g ( N ) log(N) log(N) zset
内部,会记录每个元素当前的“排行”/“次序”,查询到元素,就直接知道了元素所在的“次序”,就可以直接把max
对应的元素次序和min
对应的元素次序,减法即可
- 先根据
-
返回值:在区间的元素个数
-
min
和max
都可以写成浮点数(zset
分数本身就是浮点数)- 在浮点数中,存在两个特殊的数值
inf
:无穷大-inf
:负无穷大
- 在浮点数中,存在两个特殊的数值
ZRANGE/ZREVRANGE
返回指定区间⾥的元素,分数按照升序/降序。带上 WITHSCORES
可以把分数也返回。
语法:
ZRANGE key start stop [withscores]ZREVRANGE key start stop [withscores]
- 返回区间元素列表
ZPOPMAX/ZPOPMIN
删除并返回分数最高/最低的 count
个元素
语法:
redis">ZPOPMAX key [count]
- 返回值:分数和元素列表
如果存在多个元素,分数相同,同时为最大值,
zpopmax
删的时候,仍然只删除其中一个
BZPOPMAX/BZPOPMIN
这里的有序集合,也可以视为一个“优先级队列”,所以有的时候,也需要一个带有“阻塞功能”的优先级队列
每个 key
都是一个有序集合。阻塞也是在有序集合为空的时候触发阻塞,阻塞到有其他客户端插入元素
timeout
表示超时时间,单位是秒s
语法:
redis">BZPOPMAX key [key ...] timeout
ZRANK/ZREVRANK
返回指定元素的排名,升序/降序
语法:
redis">ZRANK key memberZREVRANKE key member
- 时间复杂度: O ( N ) O(N) O(N)
- 排名从
0
开始
ZSCORE
返回指定元素的分数
语法:
redis">ZSCORE key member
- 返回值:分数