redis | 八、redis之Zset

129 阅读5分钟

redis系列文章:
liudongdong.top/categories/…
本篇来源:
liudongdong.top/archives/re…
公众号:雨中散步撒哈拉
备注:欢迎关注公众号,一起学习,共同进步!

一、基本概念

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

实例:

127.0.0.1:6379> zadd zset 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
127.0.0.1:6379>

二、命令分类

根据个人理解和便于学习,进行了简单分类!
分为以下几类:

  1. 新增成员

  2. 删除成员

  3. 查询成员

1. 新增成员

  1. zadd:新增成员

2. 删除成员

  1. zrem:根据指定key进行删除

  2. zremrangebylex:根据指定集合区间进行删除

  3. zremrangebyrank:根据指定排名区间进行删除

  4. zremrangebyscore:根据分数区间进行删除

3. 查询成员

  1. zcard:查询集合成员数量

  2. zcount:分数区间成员数量

  3. zlexcount:成员区间成员数量

  4. zscore:指定key和值,获取分数

  5. zrange:获取成员信息

  6. zrank:指定key和值,获取下标

  7. zrangebylex:指定集合区间,获取列表

  8. zrangebyscore:指定分数区间,获取列表

  9. zrevrange:倒序展示列表

  10. zrevrangebyscore:根据分数区间,倒序展示列表

  11. zreverank:倒序获取成员下标

三、命令实践

1. 新增成员

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> zadd zset 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
127.0.0.1:6379>

2. 删除成员

# 移除zset下的one
127.0.0.1:6379> zrem zset one
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
1) "two"
2) "three"
3) "four"
4) "five"
# 移除分数排名为1和2成员
127.0.0.1:6379> zremrangebyrank zset 1 2
(integer) 2
127.0.0.1:6379> zrange zset 0 -1
1) "two"
2) "five"
# 移除分数区间为[1,2]
127.0.0.1:6379> zrange zset 0 -1
1) "two"
2) "five"
127.0.0.1:6379> zremrangebyscore zset 1 2
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
1) "five"
127.0.0.1:6379> 

3. 查询成员

127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
# 查询集合数量
127.0.0.1:6379> zcard zset
(integer) 5
# 查询成绩在[0,5]区间内的成员
127.0.0.1:6379> zcount zset 0 5
(integer) 5
# 根据集合区间进行统计
127.0.0.1:6379> zlexcount zset - +
(integer) 5
# 根据key和value值,获取分数
127.0.0.1:6379> zscore zset four
"4"
# 获取所有集合信息
127.0.0.1:6379> zrange zset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
127.0.0.1:6379> zrange zset 0 3
1) "one"
2) "two"
3) "three"
4) "four"
# 根据key和值获取下标
127.0.0.1:6379> zrank zset three
(integer) 2
# 根据集合区间进行获取集合成员
127.0.0.1:6379> zrangebylex zset - +
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
# 根据分数区间进行获取集合列表
127.0.0.1:6379> zrangebyscore zset 0 4
1) "one"
2) "two"
3) "three"
4) "four"
# 倒序排列集合
127.0.0.1:6379> zrevrange zset 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"
# 倒序排列根据分数区间
127.0.0.1:6379> zrevrangebyscore zset 5 2
1) "five"
2) "four"
3) "three"
4) "two"
# 倒序排列,根据key和value,获取下标
127.0.0.1:6379> zrevrank zset three
(integer) 2
127.0.0.1:6379>

附录

下表列出了 redis 有序集合的基本命令:

序号命令及描述
1[ZADD key score1 member1 score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key 获取有序集合的成员数
3ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5[ZINTERSTORE destination numkeys key key …] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
6ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7[ZRANGE key start stop WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8[ZRANGEBYLEX key min max LIMIT offset count] 通过字典区间返回有序集合的成员
9ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10ZRANK key member 返回有序集合中指定成员的索引
11[ZREM key member member …] 移除有序集合中的一个或多个成员
12ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15[ZREVRANGE key start stop WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16[ZREVRANGEBYSCORE key max min WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18ZSCORE key member 返回有序集中,成员的分数值
19[ZUNIONSTORE destination numkeys key key …] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)