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

来源:互联网 发布:无线点菜机软件 编辑:程序博客网 时间:2024/06/05 02:35

转自:http://blog.csdn.net/men_wen/article/details/61920981


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命令,对成员的分数进行递增操作。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
127.0.0.1:6379> ZADD score1 99 test1 98 test2(integer) 2127.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     //添加正无穷和负无穷成员
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • ZSCORE 
    • 返回有序集key中,成员member的score值。
    • 如果member元素不是有序集key的成员,或key不存在,返回nil。
 ZSCORE key member 
  • 1
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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • ZRANGE 
    • 按照元素的分数从小到大的顺序返回指定索引start到stop之间所有元素(包含两端)
 ZRANGE key start stop [WITHSCORES] 
  • 1
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)排列。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • ZREVRANGE 
    • 返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。具有相同score值的成员按字典序的反序排列。 除了成员按score值递减的次序排列这一点外,ZREVRANGE命令的其他方面和ZRANGE命令一样。
 ZREVRANGE key start stop [WITHSCORES] 
  • 1
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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 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]
  • 1
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 WITHSCORES1) "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 31) "test6"2) "95"3) "test5"4) "96"5) "test4"6) "97"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • ZREVRANGEBYSCORE 
    • ZREVRANGEBYSCORE 返回有序集合中指定分数区间内的成员,分数由高到低排序。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  • 1
127.0.0.1:6379> ZREVRANGEBYSCORE score1 +inf 98 WITHSCORES LIMIT 0 51) "max"2) "inf"3) "test3"4) "100"5) "test1"6) "99"7) "test2"8) "98.5"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • ZINCRBY 
    • 为有序集key的成员member的score值加上增量increment。如果key中不存在member,就在key中添加一个member,score是increment.
    • 如果key不存在,就创建一个只含有指定member成员的有序集合。也有可能给一个负数来减少score的值。
 ZINCRBY key increment member 
  • 1
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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • ZCARD 
    • 返回key的有序集元素个数。
 ZCARD key 
  • 1
127.0.0.1:6379> ZCARD score1(integer) 8
  • 1
  • 2
  • ZCOUNT 
    • 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。
 ZCOUNT key min max 
  • 1
127.0.0.1:6379> ZCOUNT score1 80 90(integer) 1127.0.0.1:6379> ZRANGEBYSCORE score1 80 90 WITHSCORES 1) "test1"2) "90"127.0.0.1:6379> ZCOUNT score1 80 (90(integer) 0127.0.0.1:6379> ZRANGEBYSCORE score1 80 (90 WITHSCORES (empty list or set)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • ZREM 
    • 删除一个或多个元素,返回删除元素的个数。
 ZREM key member [member ...] 
  • 1
127.0.0.1:6379> ZREM score1 min max(integer) 2127.0.0.1:6379> ZREM score1 min max(integer) 0     //不做任何操作127.0.0.1:6379> ZCARD score1(integer) 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ZREMRANGEBYRANK 
    • 移除有序集key中,指定排名(rank)区间内的所有成员。下标参数start和stop都以0为底,0处是分数最小的那个元素。这些索引也可是负数,表示位移从最高分处开始数。
ZREMRANGEBYRANK key start stop 
  • 1
127.0.0.1:6379> ZREMRANGEBYRANK score1 0 3(integer) 4127.0.0.1:6379> ZRANGE score1 0 -11) "test2"2) "test3"
  • 1
  • 2
  • 3
  • 4
  • 5
  • ZREMRANGEBYSCORE 
    • 移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。
 ZREMRANGEBYSCORE key min max 
  • 1
127.0.0.1:6379> ZRANGE score1 0 -1 WITHSCORES1) "test2"2) "98.5"3) "test3"4) "100"127.0.0.1:6379>  ZREMRANGEBYSCORE score1 98 (100(integer) 1127.0.0.1:6379> ZRANGE score1 0 -1 WITHSCORES1) "test3"2) "100"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • ZRANK 
    • 返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,也就是说,score值最小的成员排名为0。
 ZRANK key member 
  • 1
127.0.0.1:6379> ZRANK score test5(integer) 4     //排名第5
  • 1
  • 2
  • ZREVRANK 
    • 返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。
 ZREVRANK key member 
  • 1
127.0.0.1:6379> ZREVRANK score test5(integer) 1     //排名倒数第二
  • 1
  • 2
  • 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]  
  • 1
127.0.0.1:6379> ZADD test1 1 a 2 b 3 c(integer) 3127.0.0.1:6379> ZADD test2 10 a 20 b 30 c(integer) 3127.0.0.1:6379> ZINTERSTORE dest 2 test1 test2(integer) 3     //AGGREGATE默认为SUM求和127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES1) "a"2) "11"3) "b"4) "22"5) "c"6) "33"//求最小值127.0.0.1:6379> ZINTERSTORE dest 2 test1 test2 AGGREGATE MIN    (integer) 3127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES1) "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) 3127.0.0.1:6379> ZRANGE dest 0 -1 WITHSCORES1) "a"2) "0.40000000000000002"3) "b"4) "0.80000000000000004"5) "c"6) "1.2"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • ZUNIONSTORE 
    • 计算给定的numkeys个有序集合的并集,并且把结果放到destination中。在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)。 默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之和。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  • 1
127.0.0.1:6379> ZADD test2 4 d 5 e (integer) 2127.0.0.1:6379> ZUNIONSTORE dest 2 test1 test2(integer) 5127.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) 5127.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 0
原创粉丝点击