Redis-Sorted Set(有序集合)

简介

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

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

有序集合的成员是惟一的,但是分数却是可重复的。

集合是通过hash表实现的,所以添加、删除、查找的复杂度都是O(1)。

应用场景

排行榜:使用有序集合可以实现类似微信步数排行榜功能。

Zadd(添加、更新一个或多个成员)

127.0.0.1:6379> zadd zset 1 ike 1.1 andy 2 luke
(integer) 0
127.0.0.1:6379> zrange zset 0 10
1) "ike"
2) "andy"
3) "luke"

Zcard(集合中元素个数)

127.0.0.1:6379> zcard zset
(integer) 3

Zcount(计算集合中指定分数区间的元素数量)

127.0.0.1:6379> zcount zset 1 1.5
(integer) 2

Zincrby(对有序集合中指定成员的分数进行增量操作)

  • 分数值可以是整数值或双精度浮点数。

127.0.0.1:6379> zincrby zset 1 ike
"2"

Zinterstore(取一个或多个有序集合的交集存入到一个新有序集合中)

  • 语法:zinterstore newzset  keysnumber  key1  key2

    • keysnumber:与有序集合的个数对应。
127.0.0.1:6379> zinterstore zset3 2 zset zset1
(integer) 1
127.0.0.1:6379> zrange zset3 0 -1
1) "ike"

Zlexcount(获取有序集合中指定字典区间内的成员数量)

  • 按照字典(英文字母字典排序)序列限制min和max区间;注意使用字典序列返回区间的所有函数的使用隐含前提
    是该有序集合内的所有元素的分数相同。

redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
redis 127.0.0.1:6379> ZADD myzset 0 f 0 g
(integer) 2
redis 127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
redis 127.0.0.1:6379> ZLEXCOUNT myzset [b [f
(integer) 5

Zrange(返回有序集合中指定区间内的成员)

  • 其中成员的位置按分数值递增(从小到大)来排序。

  • 具有相同分数值的成员按字典序(lexicographical order )来排列。

127.0.0.1:6379> zrange myzset 0 5
1) "a"
2) "as"
3) "b"
4) "szx"
5) "c"
6) "ffs"

Zrangebylex(通过字典区间返回有序集合的成员)

redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"

Zrangebyscore(返回有序集合中指定分数区间的成员列表)

  • 有序集成员按分数值递增(从小到大)次序排列。

  • 默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
  • 语法:zrangebyscore key min max 
127.0.0.1:6379> zrangebyscore myzset -inf +inf   // 获取整个有序集合
1) "ike"
2) "luke"
3) "andy"
127.0.0.1:6379> zrangebyscore myzset -inf +inf  withscores   // 获取整个有序集及成员的 score 值
1) "ike"
2) "5"
3) "luke"
4) "10"
5) "andy"
6) "15"
127.0.0.1:6379> zrangebyscore myzset (1 5        // 返回 1 < socre <= 5
1) "ike"
127.0.0.1:6379> zrangebyscore myzset (5 (11      // 返回 1 < score < 11
1) "luke"

Zrank(返回有序集合中指定成员的排名,按分值从小到大顺序排列)

127.0.0.1:6379> zrank myzset ike
(integer) 0
127.0.0.1:6379> zrank myzset luke
(integer) 1
127.0.0.1:6379> zrank myzset andy
(integer) 2

Zrem(移除有序集合中的一个或多个成员)

  • 不存在的成员将被忽略。

  • 当key不是有序集合时,返回一个错误。

  • 返回值:被成功移除的成员数量,不包括被忽略的成员。
127.0.0.1:6379> zrem myzset luke
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1
1) "ike"
2) "andy"

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

127.0.0.1:6379> zadd myzset 0 ike 0 andy 0 luke 0 apple
(integer) 4
127.0.0.1:6379> zremrangebylex myzset [al [ddd
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "ike"
2) "luke"
127.0.0.1:6379> zremrangebylex myzset [al [zz
(integer) 2

Zremrangebyrank(移除有序集合中指定排名区间内的所有成员)

127.0.0.1:6379> zadd myzset 5 ike 10 andy 15 luke 20 apple
(integer) 4
127.0.0.1:6379> zremrangebyrank myzset 0 2   // 移除下标0 ~ 2 
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1
1) "apple"

Zremrangebyscore(移除有序集合中制定分数区间的所有成员)

127.0.0.1:6379> zremrangebyscore myzset 1 10
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1
1) "luke"
2) "apple"

Zrevrange(返回有序集合中指定区间的成员,通过索引,分数从高到低)

127.0.0.1:6379> zrevrange myzset 0 -1 withscores
1) "apple"
2) "20"
3) "luke"
4) "15"

 

Zrevrangebyscore(返回有序集合中指定分数区间内的所有成员,按分数递减排序)

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "luke"
2) "15"
3) "apple"
4) "20"
127.0.0.1:6379> zrevrangebyscore myzset 15 1
1) "luke"
127.0.0.1:6379> zrevrangebyscore myzset +inf -inf    //  逆序排列所有成员
1) "apple"
2) "luke"

Zrevrank(返回有序集合中成员的排名,其中有序集合成员按照分数递减排序)

127.0.0.1:6379> zrevrank myzset luke
(integer) 1
127.0.0.1:6379> zrevrank myzset apple
(integer) 0

Zscore(返回有序集合中成员的分数值)

  • 返回值:如果成员不是有序集合中的成员,或者key不存在,则返回nil。
127.0.0.1:6379> zscore myzset luke
"15"

Zunionstore(给定一个或多个有序集合的并集,并存储到新的有序集合中)

127.0.0.1:6379> zadd zset1 500 jack 1000 luke 2000 ike 3000 andy
(integer) 4
127.0.0.1:6379> zadd zset2 500 apple 1000 luke 2000 ike 3000 andy
(integer) 4
127.0.0.1:6379> zunionstore zset3 2 zset1 zset2 weights  1 3    //  zset1 * 1 zset2 * 3
127.0.0.1:6379> zrange zset3 0 -1 withscores
 1) "jack"
 2) "500"
 3) "apple"
 4) "1500"
 5) "luke"
 6) "4000"
 7) "ike"
 8) "8000"
 9) "andy"
10) "12000"

Zscan(迭代有序集合中的元素)

  • 返回值:返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
127.0.0.1:6379> zscan zset3 0 match "i*"
1) "0"
2) 1) "ike"
   2) "10000"

有序集合中有三种排序方式:按分数排序、按索引、按字典区间(也就是值的字母数字等区间排序)

 

posted @ 2020-05-22 22:35  TrumpC  阅读(106)  评论(0)    收藏  举报