zadd key [nx|xx] [CH] [INCR] score member [score member ...]
//英语成绩,张三60分,李四70分,王五90分 127.0.0.1:6379> zadd english_score 60 zhangsan 70 lisi 90 wangwu (integer) 3 127.0.0.1:6379> zrange english_score 0 -1 withscores 1) "zhangsan" 2) "60" 3) "lisi" 4) "70" 5) "wangwu" 6) "90" //NX:不更新存在的成员。只添加新成员 //张三已存在,所以返回0 127.0.0.1:6379> zadd english_score nx 70 zhangsan (integer) 0 127.0.0.1:6379> zadd english_score nx 60 xiaoming (integer) 1 //XX:仅更新存在的成员,不添加新成员 127.0.0.1:6379> zadd english_score xx 60 zhaoliu (integer) 0 127.0.0.1:6379> zadd english_score xx 70 zhangsan (integer) 0 //张三存在分数改为70,赵六不存在无操作 127.0.0.1:6379> zrange english_score 0 -1 withscores 1) "xiaoming" 2) "60" 3) "lisi" 4) "70" 5) "zhangsan" 6) "70" 7) "wangwu" 8) "90" //CH:成员不存在就添加,存在就更新分值,返回值为分值发生变化的成员总数;分数不变不计算; //张三分数改为80,添加赵六分数为75.5 127.0.0.1:6379> zadd english_score ch 80 zhangsan 75.5 zhaoliu (integer) 1 127.0.0.1:6379> zrange english_score 0 -1 withscores 1) "xiaoming" 2) "60" 3) "lisi" 4) "70" 5) "zhaoliu" 6) "75.5" 7) "zhangsan" 8) "80" 9) "wangwu" 10) "90" //INCR:指定这个选项的时候,命令等于zincrby命令,对成员的分数进行递增操作,返回操作后的分值 //张三分数+5 127.0.0.1:6379> zadd english_score incr 5 zhangsan "85" 127.0.0.1:6379> zrange english_score 0 -1 withscores 1) "xiaoming" 2) "60" 3) "lisi" 4) "70" 5) "zhaoliu" 6) "75.5" 7) "zhangsan" 8) "85" 9) "wangwu" 10) "90"
zcard key
127.0.0.1:6379> zcard english_score (integer) 3
zscore key member
127.0.0.1:6379> zscore english_score lisi "70"
zrange key start stop [WITHSCORES]
按分值递增排序,通过索引区间返回有序集合指定区间内的成员,withscores为输出结果带分数
127.0.0.1:6379> zrange english_score 0 -1 1) "zhangsan" 2) "lisi" 3) "wangwu" 127.0.0.1:6379> zrange english_score 0 -1 withscores 1) "zhangsan" 2) "60" 3) "lisi" 4) "70" 5) "wangwu" 6) "90"
zrangebylex key min max [LIMIT offset count]
通过字典区间返回有序集合的成员。
min:字典中排序位置较小的成员,必须以”[“开头,或者以”(“开头,可使用”-“代替
max:字典中排序位置较大的成员,必须以”[“开头,或者以”(“开头,可使用”+”代替
limit:返回结果是否分页,指令中包含LIMIT后offset、count必须输入
offset:返回结果起始位置
count:返回结果数量
注意:
- 不要在分数不一致的SortSet集合中去使用 ZRANGEBYLEX 指令,因为获取的结果并不准确。
- 成员字符串作为二进制数组的字节数进行比较。
- 默认是以ASCII字符集的顺序进行排列。如果成员字符串包含utf-8这类字符集的内容,就会影响返回结果,所以建议不要使用。
- 默认情况下, “max” 和 “min” 参数前必须加 “[” 符号作为开头。”[” 符号与成员之间不能有空格, 返回成员结果集会包含参数 “min” 和 “max” 。
- “max” 和 “min” 参数前可以加 “(” 符号作为开头表示小于, “(” 符号与成员之间不能有空格。返回成员结果集不会包含 “max” 和 “min” 成员。
- 可以使用 “-” 和 “+” 表示得分最小值和最大值
- “min” 和 “max” 不能反, “max” 放前面 “min”放后面会导致返回结果为空
- 与ZRANGEBYLEX获取顺序相反的指令是ZREVRANGEBYLEX。
- 源码中采用C语言中memcmp() 函数, 从字符的第0位到最后一位进行排序,如果前面部分相同,那么较长的字符串比较短的字符串排序靠后。
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g (integer) 7 127.0.0.1:6379> ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" 127.0.0.1:6379> ZRANGEBYLEX myzset - (c 1) "a" 2) "b" 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f"
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
按分值递增排序,通过分数区间返回有序集合指定区间内的成员
127.0.0.1:6379> zrangebyscore english_score 60 80 withscores 1) "xiaoming" 2) "60" 3) "lisi" 4) "70" 5) "zhaoliu" 6) "75.5"
zrank key member
有序集成员按分数值递增(从小到大)排序,返回有序集合中指定成员的排名索引
127.0.0.1:6379> zrange english_score 0 -1 1) "xiaoming" 2) "lisi" 3) "zhaoliu" 4) "zhangsan" 5) "wangwu" //zhangsan的索引是3 127.0.0.1:6379> zrank english_score zhangsan (integer) 3
zrevrange key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange english_score 0 -1 withscores 1) "wangwu" 2) "90" 3) "zhangsan" 4) "85" 5) "zhaoliu" 6) "75.5" 7) "lisi" 8) "70" 9) "xiaoming" 10) "60"
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> zrevrangebyscore english_score 80 70 withscores 1) "zhaoliu" 2) "75.5" 3) "lisi" 4) "70"
zrevrank key member
127.0.0.1:6379> zrevrange english_score 0 -1 1) "wangwu" 2) "zhangsan" 3) "zhaoliu" 4) "lisi" 5) "xiaoming" 127.0.0.1:6379> zrevrank english_score zhangsan (integer) 1 127.0.0.1:6379> zrevrank english_score lisi (integer) 3
zrem key member [member ...]
127.0.0.1:6379> zrevrange english_score 0 -1 1) "wangwu" 2) "zhangsan" 3) "zhaoliu" 4) "lisi" 5) "xiaoming" 127.0.0.1:6379> zrem english_score xiaoming (integer) 1 127.0.0.1:6379> zrevrange english_score 0 -1 1) "wangwu" 2) "zhangsan" 3) "zhaoliu" 4) "lisi"
zremrangebylex key min max
zremrangebyrank key start stop
zremrangebyscore key min max
zcount key min max
计算在有序集合中指定区间分数的成员数
127.0.0.1:6379> zrevrange english_score 0 -1 withscores 1) "wangwu" 2) "90" 3) "zhangsan" 4) "85" 5) "zhaoliu" 6) "75.5" 7) "lisi" 8) "70" //80-90分的有两个,张三和王五 127.0.0.1:6379> zcount english_score 80 90 (integer) 2
zlexcount key min max
在有序集合中计算指定字典区间内成员数量
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e (integer) 5 127.0.0.1:6379> ZADD myzset 0 f 0 g (integer) 2 127.0.0.1:6379> ZLEXCOUNT myzset - + (integer) 7 127.0.0.1:6379> ZLEXCOUNT myzset [b [f (integer) 5
zincrby key increment member
有序集合中对指定成员的分数加上增量 increment
可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
分数值可以是整数值或双精度浮点数。
127.0.0.1:6379> zincrby english_score 0.5 zhaoliu "76"
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
命令计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。
WEIGHTS
:使用 WEIGHTS 选项,你可以为每个给定有序集分别指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。
AGGREGATE
:使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。
//有序集 mid_test 127.0.0.1:6379> ZADD mid_test 70 "Li Lei" (integer) 1 127.0.0.1:6379> ZADD mid_test 70 "Han Meimei" (integer) 1 127.0.0.1:6379> ZADD mid_test 99.5 "Tom" (integer) 1 //另一个有序集 fin_test 127.0.0.1:6379> ZADD fin_test 88 "Li Lei" (integer) 1 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei" (integer) 1 127.0.0.1:6379> ZADD fin_test 99.5 "Tom" (integer) 1 //交集 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test (integer) 3 //显示有序集内所有成员及其分数值 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199"
zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
命令计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。
127.0.0.1:6379> zadd zset1 1 one 2 two (integer) 2 127.0.0.1:6379> zadd zset2 1 one 2 two 3 three (integer) 3 127.0.0.1:6379> zunionstore out 2 zset1 zset2 WEIGHTS 2 3 (integer) 3 127.0.0.1:6379> zrange out 0 -1 withscores 1) "one" 2) "5" 3) "three" 4) "9" 5) "two" 6) "10"
本质是一种查找结构,用于解决算法中的查找问题,根据给定的key快速查找到它所在位置,是对有序链表的优化,查找的效率一般为O(logn)。
例子:
由于新增的指针,我们不需要跟链表中每个节点进行比较,而是先跳跃着比较,缩小比较范围,再进行查找增加了查找的效率,在二层之上,我们还可以添加三层,四层,skiplist正式由此启发而诞生的数据结构。
为了插入节点方便,skiplist不要求上下相邻两层链表之间的节点个数有严格的对应关系,而是针对每个节点随机出一个层数,以下是一个skiplist生成的过程。
若要在这样的跳表查找23,流程如下: