Redis 学习笔记(七)之 有序集合

Redis 学习笔记(七)之 有序集合

1.介绍

  • 在集合类型的基础上,有序集合类型为集合中的每个元素都关联了一个分数,使得在完成插入、删除的集合类型的操作时,还能够获得分数最高(或最低)的前N个元素等与分数有关的操作。
  • 集合元素具有唯一性,但是分数可以相同

2. 比较

有序集合类型和列表类型的相似点:

  1. 二者都是有序的。
  2. 二者都可以获得某一范围的元素。

有序集合类型和列表类型的区别:

  1. 列表类型内部由双向链表实现,访问靠近两端数据极快,但访问中间元素较慢,有序集合内部有散列表和跳跃表(skip list)实现,读取中间的数据也很快。
  2. 有序集合可以通过分数调整某个元素的位置,而列表类型无法简单实现。
  3. 有序集合比列表更耗费内存。

3. 有序集合(sorted set)命令

  • ZADD
    • 将所有指定成员添加到键为key有序集合(sorted set)里面。如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。
    • 如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。
    • 分数值是一个双精度的浮点型数字字符串。+inf和-inf都是有效值。
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

//XX: 仅仅更新存在的成员,不添加新成员。
//NX: 不更新存在的成员。只添加新成员。
//CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
//INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
127.0.0.1:6379> ZADD score1 99 test1 98 test2
(integer) 2
127.0.0.1:6379> ZADD  score1 NX 97 test1 100 test3
(integer) 1     //不更新只添加
127.0.0.1:6379> ZADD score1 XX 98.5 test2 99.5 test4
(integer) 0     //不添加只更新
127.0.0.1:6379> ZADD socre1 +inf max -inf min
(integer) 2     //添加正无穷和负无穷成员
  • ZSCORE
    • 返回有序集key中,成员member的score值。
    • 如果member元素不是有序集key的成员,或key不存在,返回nil。
 ZSCORE key member 
127.0.0.1:6379> ZSCORE score1 test2
"98.5"
127.0.0.1:6379> ZSCORE score1 test4
(nil)       //不存在返回空
127.0.0.1:6379> ZSCORE score1 max
"inf"
127.0.0.1:6379> ZSCORE score1 min
"-inf"
  • ZRANGE
    • 按照元素的分数从小到大的顺序返回指定索引start到stop之间所有元素(包含两端)
 ZRANGE key start stop [WITHSCORES] 
127.0.0.1:6379> ZRANGE score1 0 -1 WITHSCORES
 1) "min"
 2) "-inf"
 3) "test2"
 4) "98.5"
 5) "test1"
 6) "99"
 7) "test3"
 8) "100"
 9) "max"
10) "inf"
//按分数从小到大排序,如果两个元素分数相同,则按照字典顺序从(0<9<A<Z<a<z)排列。
  • ZREVRANGE
    • 返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。具有相同score值的成员按字典序的反序排列。 除了成员按score值递减的次序排列这一点外,ZREVRANGE命令的其他方面和ZRANGE命令一样。
 ZREVRANGE key start stop [WITHSCORES] 
127.0.0.1:6379> ZREVRANGE score1 0 -1 WITHSCORES
 1) "max"
 2) "inf"
 3) "test3"
 4) "100"
 5) "test1"
 6) "99"
 7) "test2"
 8) "98.5"
 9) "min"
10) "-inf"
  • ZRANGEBYSCORE
    • 返回key的有序集合中的分数在min和max之间的所有元素(包括分数等于max或者min的元素)。元素被认为是从低分到高分排序的。
    • 具有相同分数的元素按字典序排列(这个根据redis对有序集合实现的情况而定,并不需要进一步计算)。
    • 可选的LIMIT参数指定返回结果的数量及区间(类似SQL中SELECT LIMIT offset, count)。注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)的复杂度。
    • 可选参数WITHSCORES会返回元素和其分数,而不只是元素。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE score1 95 100 WITHSCORES
 1) "test6"
 2) "95"
 3) "test5"
 4) "96"
 5) "test4"
 6) "97"
 7) "test2"
 8) "98.5"
 9) "test1"
10) "99"
11) "test3"
12) "100"
//如果不想包含区间的边界,使用 '(' 左括号不包含边界
//大于95小于100结果如下:
127.0.0.1:6379> ZRANGEBYSCORE score1 (95 (100 WITHSCORES
1) "test5"
2) "96"
3) "test4"
4) "97"
5) "test2"
6) "98.5"
7) "test1"
8) "99"
//大于95的前三个
127.0.0.1:6379> ZRANGEBYSCORE score1 95 +inf WITHSCORES LIMIT 0 3
1) "test6"
2) "95"
3) "test5"
4) "96"
5) "test4"
6) "97"
  • ZREVRANGEBYSCORE
    • ZREVRANGEBYSCORE 返回有序集合中指定分数区间内的成员,分数由高到低排序。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZREVRANGEBYSCORE score1 +inf 98 WITHSCORES LIMIT 0 5
1) "max"
2) "inf"
3) "test3"
4) "100"
5) "test1"
6) "99"
7) "test2"
8) "98.5"
  • ZINCRBY
    • 为有序集key的成员member的score值加上增量increment。如果key中不存在member,就在key中添加一个member,score是increment.
    • 如果key不存在,就创建一个只含有指定member成员的有序集合。也有可能给一个负数来减少score的值。
 ZINCRBY key increment member 
127.0.0.1:6379> ZSCORE score1 test1 
"99"
127.0.0.1:6379> ZINCRBY score1 1 test1
"100"
127.0.0.1:6379> ZSCORE score1 test1 
"100"
127.0.0.1:6379> ZINCRBY score1 -10 test1
"90"
127.0.0.1:6379> ZSCORE score1 test1 
"90"
  • ZCARD
    • 返回key的有序集元素个数。
 ZCARD key 
127.0.0.1:6379> ZCARD score1
(integer) 8
  • ZCOUNT
    • 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。
 ZCOUNT key min max 
127.0.0.1:6379> ZCOUNT score1 80 90
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE score1 80 90 WITHSCORES 
1) "test1"
2) "90"
127.0.0.1:6379> ZCOUNT score1 80 (90
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE score1 80 (90 WITHSCORES 
(empty list or set)
  • ZREM
    • 删除一个或多个元素,返回删除元素的个数。
 ZREM key member [member ...] 
127.0.0.1:6379> ZREM score1 min max
(integer) 2
127.0.0.1:6379> ZREM score1 min max
(integer) 0     //不做任何操作
127.0.0.1:6379> ZCARD score1
(integer) 6
  • ZREMRANGEBYRANK
    • 移除有序集key中,指定排名(rank)区间内的所有成员。下标参数start和stop都以0为底,0处是分数最小的那个元素。这些索引也可是负数,表示位移从最高分处开始数。
ZREMRANGEBYRANK key start stop 
127.0.0.1:6379> ZREMRANGEBYRANK score1 0 3
(integer) 4
127.0.0.1:6379> ZRANGE score1 0 -1
1) "test2"
2) "test3"
  • ZREMRANGEBYSCORE
    • 移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。
 ZREMRANGEBYSCORE key min max 
127.0.0.1:6379> ZRANGE score1 0 -1 WITHSCORES
1) "test2"
2) "98.5"
3) "test3"
4) "100"
127.0.0.1:6379>  ZREMRANGEBYSCORE score1 98 (100
(integer) 1
127.0.0.1:6379> ZRANGE score1 0 -1 WITHSCORES
1) "test3"
2) "100"
  • ZRANK
    • 返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,也就是说,score值最小的成员排名为0。
 ZRANK key member 
127.0.0.1:6379> ZRANK score test5
(integer) 4     //排名第5
  • ZREVRANK
    • 返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。
 ZREVRANK key member 
127.0.0.1:6379> ZREVRANK score test5
(integer) 1     //排名倒数第二
  • ZINTERSTORE
    • 计算给定的numkeys个有序集合的交集,并且把结果放到destination中。 在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。
    • 默认情况下,结果中一个元素的分数是有序集合中该元素分数之和,前提是该元素在这些有序集合中都存在。因为交集要求其成员必须是给定的每个有序集合中的成员,结果集中的每个元素的分数和输入的有序集合个数相等。
    • 如果destination存在,就把它覆盖。
    • 使用WEIGHTS选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的score值在传递给聚合函数之前都要先乘以该因子。如果WEIGHTS没有给定,默认就是1。
    • 使用AGGREGATE选项,你可以指定交集的结果集的聚合方式。默认使用的参数SUM,可以将所有集合中某个成员的score值之和作为结果集中该成员的score值。如果使用参数MIN或者MAX,结果集就是所有集合中元素最小或最大的元素。
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]  
127.0.0.1:6379> ZADD test1 1 a 2 b 3 c
(integer) 3
127.0.0.1:6379> ZADD test2 10 a 20 b 30 c
(integer) 3
127.0.0.1:6379> ZINTERSTORE dest 2 test1 test2
(integer) 3     //AGGREGATE默认为SUM求和
127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES
1) "a"
2) "11"
3) "b"
4) "22"
5) "c"
6) "33"
//求最小值
127.0.0.1:6379> ZINTERSTORE dest 2 test1 test2 AGGREGATE MIN    
(integer) 3
127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
//使用WEIGHTS参数,求最大值
127.0.0.1:6379> ZINTERSTORE dest 2 test1 test2 WEIGHTS 0.3 0.04 AGGREGATE MAX
(integer) 3
127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES
1) "a"
2) "0.40000000000000002"
3) "b"
4) "0.80000000000000004"
5) "c"
6) "1.2"
  • ZUNIONSTORE
    • 计算给定的numkeys个有序集合的并集,并且把结果放到destination中。在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。 默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之和。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
127.0.0.1:6379> ZADD test2 4 d 5 e 
(integer) 2
127.0.0.1:6379> ZUNIONSTORE dest 2 test1 test2
(integer) 5
127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES
 1) "d"
 2) "4"
 3) "e"
 4) "5"
 5) "a"
 6) "11"
 7) "b"
 8) "22"
 9) "c"
10) "33"

127.0.0.1:6379> ZUNIONSTORE dest 2 test1 test2 WEIGHTS 1 0.2 AGGREGATE MAX
(integer) 5
127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES
 1) "d"
 2) "0.80000000000000004"       //浮点数精度
 3) "e"
 4) "1"
 5) "a"
 6) "2"
 7) "b"
 8) "4"
 9) "c"
10) "6"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值