有序集合是在集合类型的基础上为集合中的每个元素都关联了一个分数,这使得可以在完成插入,删除和判断元素是否存在等基础上,还能否获得分数最高(或最低的)前N项,或一定分数范围的元素等操作。有序也就是通过这个分数而是实现的。
1 与列表的异同
特性
有序集合类型
列表类型
存储内容
至多
个字符串
至多
个字符串
有序性
是
是
唯一性
是
否
实现方式
使用散列表和跳跃表(Skip list)实现
通过链表实现
查询速度
读取中间速度也很快,时间复杂度O(log(N))
靠近两端块,中间慢
使用场景
TopN场景
“日志”类场景,很少使用中间数据
是否能调整元素位置
通过调整分值
不能调整
内存消耗
大
小
2 Java代码实现
(暂无)
可以理解为有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。不能存在重复数据,如添加重复数据,则只更新score值。
3 命令
API方法名
作用
zadd
向名称为key的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序
zrange
返回名称为key的zset(按score从小到大顺序)中的index从start到end的所有元素
zrem
删除名称为key的zset中的元素member
zincrby
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment
zrank
返回名称为key的zset中member元素的排名(按score从小到大排序)即下标(非scores值)
zrevrank
返回名称为key的zset中member元素的排名(按score从大到小排序)即下标
zrevrange
返回名称为key的zset(按score从大到小顺序)中的index从start到end的所有元素
zrangebyscore
返回集合中score在给定区间的元素
zcount
返回集合中score在给定区间的数量
zcard
返回集合中元素个数
zremrangebyrank
删除集合中元素索引(下标)在给定区间的元素
zremrangebyscore
删除集合中score在给定区间的元素
3.1 zadd
zadd key score member [score member ...]
用来向有序集合中加入一个元素和该元素的分值,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数(不包含之前已经存在的元素)。
127.0.0.1:6378> zadd scoreboard 89 tom 67 peter 100 david
(integer) 3
127.0.0.1:6378> zrange scoreboard 0 4
1) "peter"
2) "tom"
3) "david"
127.0.0.1:6378> zrange scoreboard 0 4 withscores
1) "peter"
2) "67"
3) "tom"
4) "89"
5) "david"
6) "100"
127.0.0.1:6378> zadd scoreboard 90 peter
(integer) 0
127.0.0.1:6378> zrange scoreboard 0 4 withscores
1) "tom"
2) "89"
3) "peter"
4) "90"
5) "dav