聪明在于勤奋,天才在于积累。
目录
zset 有序集合
有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分数。
下图是一个很典型的示例:
分数设置好之后,就可以根据分数来进行排序。
但是任然需要要求zset中的元素是唯一的,因为zset依然是一个集合类型。但是分数是可以重复的。zset主要还是用来存member,分数只是用来辅助的作用。
zset相关命令
zadd
往一个有序集合中添加member(元素)和分数。
member是唯一的,但是分数是可以相同的,相同的分数会有什么效果?相同的分数之间排序是根据member的字典顺序进行排序的。上面有一张图很好的说明了 这点。
语法:
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
- key 是一个最基本的键值对,是zadd的作用对象。
- 添加的时候,既要添加元素,又要添加分数。这里的member和score称为一个pair。不要把pair理解为一个键值对。
- XX:(exists)仅仅用于更新已经存在的元素,不会添加新元素
- NX:(not exists)仅仅添加新元素,不会更新已经存在的元素
- GT:greater than。仅仅当更新分数的时候,新的分数小于原来的分数才生效。
- LT:less than。仅仅当更新分数的时候,新的分数大于原来的分数才生效。
- CH:(changed)默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
- incr:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数。
- 时间复杂度:O(
N)。
- 返回值:本次添加成功的元素个数
示例:
查看里面的有序集合中的元素详细:
但是没有分数。携带参数withscores继续查询(查询结果是升序的):
尝试将zhangsan的分数99改为97
修改的分数会自动进行移动元素位置,保持原有的升序顺序。
zcard
获取一个 zset 的基数(cardinality),即 zset 中的元素个数
语法:zcard key
- 时间复杂度:O(1)
- 返回值:zset 内的元素个数。
示例:
zcount
返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:zcount key min max
- 时间复杂度:O(log(N))
- 返回值:满足条件的元素列表个数。
- min和max本身是可以写成浮点数的。
- min和max默认是闭区间,如果想排除边界值,可以在数值的前面加上括号
- 支持使用 'inf' 和 '-inf' 来表示min和max。
示例:
排除边界值1:
排除边界值3:
浮点数中存在两个特殊的数值:
- Inf:无穷大
- -inf:负无穷大
可以使用inf和-inf来找到zset中的所有元素:
zrange
返回指定区间里的元素,分数按照升序。带上 WITHSCORES (withsocresÿ