陈大剩博客

Redis 有序集合(Zsets) 复习

  • 陈大剩
  • 2022-09-10 16:13:46
  • 450

介绍

sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。

应用场景

主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等

专有名词区分

需注意有序集合中 排名分数索引字典 等词区分。
字典 相当于集合中的元素,也是说 分数下面的
其中 排名 就是根据 分数从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名

命令大纲

新增(ZADD、ZINCRBY)

添加一个或多个成员,或者更新成员的分数(ZADD)

# NX|XX 仅更新存在的成员,不添加新成员| 不更新存在的成员,只添加新成员
# GT|LT 更新新的分值比当前分值小的成员,不存在则新增| 更新新的分值比当前分值大的成员,不存在则新增 (6.2版本添加)
# CH 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内
注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
# INCR ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对
注意: GT, LT 和 NX 三者互斥不能同时使用。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

CH 是默认自带

返回值

> ZADD zsets1 1 php 2 java 3 python 4 c++
(integer) 4

对指定成员的分数加上增量 (ZINCRBY)

# increment 增量
ZINCRBY key increment member

返回值

> ZINCRBY zsets1 12 php
"14"

查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)

获取有序集合的成员数(ZCARD)

ZCARD key

返回值

> ZCARD zsets1
(integer) 6

计算在有序集合中指定区间分数的成员数(ZCOUNT)

# min 最大分数 max 最小分数
ZCOUNT key min max

返回值

> ZCOUNT zsets1 0 100
(integer) 6

获取值的区间内成员数量(ZLEXCOUNT)

ZLEXCOUNT key min max

注意:此处是值,并不是分数

返回值

> ZLEXCOUNT zsets4 [a [z
(integer) 8
> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"

通过索引区间返回有序集合指定区间内的成员(ZRANGE)

# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]

返回值

> ZRANGE  zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c++"
6) "c"

通过分数返回区间内的成员(ZRANGEBYSCORE)

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

在分数中 ( 是不带等于 如:(5 (10 = 5<score<10; (5 [10= 5<score<=10;

返回值

# 显示分数0到100(不包括100)
> ZRANGEBYSCORE zsets4 0 (100 
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
# 全显示
> ZRANGEBYSCORE zsets4 -inf +inf
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
# 从索引1开始取5条数据
> ZRANGEBYSCORE zsets4 -inf +inf limit 1 5
1) "java"
2) "py"
3) "python"
4) "ruby"
5) "c"

指定成员的排名(ZREVRANK)【分数值递减(从大到小)排序】

ZREVRANK key member

注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几

返回值

> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREVRANK zsets1 c++
(integer) 2

查找成员的分数值(ZSCORE)

ZSCORE key member

返回值

> ZSCORE zsets1 java
"2"

返回指定成员的排名(ZRANK)

ZRANK key member

返回值

> ZRANK zsets1 java
(integer) 1
> ZRANK zsets1 php
(integer) 0
> ZRANK zsets1 c++
(integer) 3

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
> ZRANK zsets4 c
(integer) 5

一个或多个有序集的交集并将结果集存储在新的有序集(ZINTERSTORE)

# destination 新的集合 numkeys 合并集合数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]

返回值

> zadd zsets2 1 c++ 2 py 3 ruby
(integer) 2
> ZINTERSTORE zsets3 2 zsets1 zsets2
(integer) 1
> ZRANGE zsets3 0 -1
1) "c++"

一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)

# destination 新的集合 numkeys 合并集合数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]

返回值

> ZUNIONSTORE zsets4 2 zsets1 zsets2
(integer) 8
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"

返指定区间内的成员(ZREVRANGE)【通过索引,分数从高到低】

ZREVRANGE key start stop [WITHSCORES]

返回值

> ZREVRANGE zsets4 0 -1
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

注意:max在前,min在后,不然可能查不到数据

返回值

> ZREVRANGEBYSCORE zsets4 +inf -inf
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

删除(ZREM、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX)

删除一个或多个成员(ZREM)

ZREM key member [member ...]

返回值

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
> ZREM zsets4 a c++
(integer) 2
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"

删除排名区间的所有成员 (ZREMRANGEBYRANK)

ZREMRANGEBYRANK key start stop

返回值

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
> ZREMRANGEBYRANK zsets4 0 3
(integer) 4
> ZRANGE zsets4 0 -1
1) "ruby"
2) "c"

删除分数区间的所有成员(ZREMRANGEBYSCORE)

ZREMRANGEBYSCORE key min max

返回值

> ZRANGE zsets4 0 -1 WITHSCORES
1) "ruby"
2) "3"
3) "c"
4) "5"
> ZREMRANGEBYSCORE zsets4 -inf +inf
(integer) 2
> ZRANGE zsets4 0 -1 WITHSCORES
(empty array)

移除有序集合中给定的字典区间的所有成员(ZREMRANGEBYLEX)

ZREMRANGEBYLEX key min max

返回值

> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREMRANGEBYLEX zsets1 (java [aaaa
(integer) 0

其他操作(ZSCAN)

迭代(ZSCAN)

ZSCAN key cursor [MATCH pattern] [COUNT count]

返回值

参考字符串迭代

本文参考&引用

Redis 有序集合(sorted set) | 菜鸟教程

Redis 中 SortedSet(集合)类型的命令

分享到:
0

说点儿什么吧

头像

表情

本站由陈大剩博客程序搭建 | 湘ICP备2023000975号| Copyright © 2017 - 陈大剩博客 | 本站采用创作共用版权:CC BY-NC 4.0

站长统计| 文章总数[109]| 评论总数[9]| 登录用户[22]| 时间点[112]

logo

登入

社交账号登录