原文地址 Redis 的 Sorted Set 有序集合命令
Sorted Set 是 Set 的一个升级版本,它在 Set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。
Sorted Set 有序集合 | |
添加一个元素 | >zadd myzset 1 one 向 myzset 集合添加一个顺序号为 “1” 的元素“one” 注: 1. 集合中的元素值是唯一的 (不允许重复,也没有重复)。 2. 重复添加某元素时,虽返回 0,但实际会更新了此元素的顺序号值。 3. 顺序号值允许重复,即同一顺序号值可以对应多个的元素值 (多个元素值可以对应同一顺序号)。 |
使某元素的顺序号自增 | >zincrby myzset 1 three 使元素 “three” 的顺序号值 + 1 >zincrby myzset 3 three 使元素 “three” 的顺序号值 + 3 >zincrby myzset -2 three 使元素 “three” 的顺序号值 - 2 注: 1. 给正值就自加,给负值就自减; 2. 若给的元素值不存在,则会将其序号值设为 0,然后再运算。 返回:返回自增 (自减) 运算后的结果值 |
部分获取集合元素 注:range 是通过 (下标) 索引偏移获取元素 | >zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "file" 4) "2" 5) "three" 6) "4" 7) "seven" 8) "7" 获取全部元素,并附带序号;排序:zrange 将顺序号按从 “小 -> 大”排序 >zrange myzset 2 -3 withscores 获取下标 (索引) 从第 2 个偏移到第 - 3 个偏移的元素 注:第一个偏移从首 0 计数 (需 n1>=0),第二个偏移正负均可 (首、尾偏移值均为 - 1); >zrevrange myzset 0 -1 withscores 1) "seven" 2) "7" 3) "three" 4) "4" 5) "file" 6) "2" 7) "one" 8) "1" 获取全部元素,并附带序号;排序:zrevrange 将顺序号按从 “大 -> 小”排序 >zrevrange myzset 1 -2 withscores 1) "three" 2) "4" 3) "file" 4) "2" |
先按顺序号从 “小 -> 大”排序 然后指定 “顺序号区间” 获取元素 注:by score 按顺序号取元素 | >zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "file" 4) "2" 5) "three" 6) "4" 7) "seven" 8) "7" >zrangebyscore myzset 4 6 withscores 1) "three" 2) "4" 求顺序号介于 4~6 区间元素,只有一个 “three” 符合条件 (range 默认按序号由小 -> 大排序) >zrangebyscore myzset 4 7 withscores 1) "three" 2) "4" 3) "seven" 4) "7" 求顺序号介于 4~7 区间元素,有一个 “three” 和“seven”符合条件 (range 默认按序号由小 -> 大排序) |
先按顺序号从 “大 -> 小”排序 然后指定 “顺序号区间” 获取元素 注:by score 按顺序号取元素 | >zrevrange myzset 0 -1 withscores 1) "seven" 2) "7" 3) "three" 4) "4" 5) "file" 6) "2" 7) "one" 8) "1" >zrevrangebyscore myzset 7 4 withscores 1) "seven" 2) "7" 3) "three" 4) "4" 求顺序号介于 7~4 区间元素,有一个 “seven” 和“three”符合条件 (range 默认按序号由大 -> 小排序) |
先按顺序号从 “小 -> 大”排序, 然后获取 “指定元素” 的下标 (索引) 值 rank [ræŋk] 次序,顺序 | >zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "file" 4) "2" 5) "three" 6) "4" 7) "seven" 8) "7" >zrank myzset one 获取元素 “one” 的下标 (索引) 值 (integer) 0 >zrank myzset three 获取元素 “three” 的下标 (索引) 值 (integer) 2 注:zrank 先将集合按顺序号按 “小 -> 大”排序,然后取元素在集合中的下标 (索引) 顺序,类似数组下标从 0 开始计数,one 和 three 的下标 (索引) 值分别是 0 和 2,序号值分别是 1 和 4。元素下标 (索引) 值 同 元素顺序号值是两个概念。 |
先按顺序号从 “大 -> 小”排序, 然后获取 “指定元素” 的下标 (索引) 值 rank [ræŋk] 次序,顺序 | >zrevrange myzset 0 -1 withscores 1) "seven" 2) "7" 3) "three" 4) "4" 5) "file" 6) "2" 7) "one" 8) "1" 说明:zrevrange 将序号 score 值从大到小排序 >zrevrank myzset one (integer) 3 >zrevrank myzset three (integer) 1 one 和 three 的下标 (索引) 值分别是 3 和 1 |
返回给定元素对应的顺序号 | >zscore myzset three "4" |
先按顺序号从 “小 -> 大”排序, 返回给定” 顺序号区间 “的元素个数 | >zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "file" 4) "2" 5) "three" 6) "4" 7) "seven" 8) "7" >zcount myzset 2 3 (integer) 1 >zcount myzset 2 4 (integer) 2 >zcount myzset 2 5 (integer) 2 >zcount myzset 2 6 (integer) 2 >zcount myzset 2 7 (integer) 3 |
获取集合中元素总个数 | >zcard myzset 返回集合中的元素总个数; |
按元素名称删除元素 | >zrem myzset two 从 myzset 集合中删除指定元素 “two”, 对应序号被一起删除 >zrem myzset four six 一次删除多个元素 返回实际被删除的元素个数 |
先按顺序号从 “小 -> 大”排序, 按索引 (下标) 区间删除元素 | >zremrangebyrank myzset 1 1 删除索引 (下标) 区间在 [1,1] 的元素,即删除下标为 1 的元素 >zremrangebyrank myzset 2 4 删除索引 (下标) 区间在 [2,4] 的元素 返回实际被删除的元素个数 |
先按顺序号从 “小 -> 大”排序, 按顺序号区间删除元素 | >zremrangebyscore myzset 2 2 (integer) 1 删除顺序号区间在 [2,2] 的元素,即:删除顺序号为 2 的元素。 >zremrangebyscore myzset 2 4 删除顺序号区间在 [2,4] 的元素 返回实际被删除的元素个数 |