1、简单描述
和set类型一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set的实现是skip list和hash table的混合体。当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另外就是score到元素的映射是被添加到skip list,并且按照score排序,所以是有序的。添加和删除操作的开销都是O(log(n))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部读取元素。
sorted set最经常的使用方式应该是作为索引来使用。我们可以把要排序的字段作为score存储,对象的id当元素存储。
2、相关命令(基于4.0.1版本)
1)zadd命令:添加元素,支持添加多个元素。如果元素存在,则修改score值。
2)zincrby命令:给一个元素的score加上一个值(可以是负数/浮点数)
【注意】zincrby允许加负数或浮点数。因为score是double类型。
3)zrem命令:删除元素,支持删除多个。
4)zrank命令:获取元素在有序集合中的排名,根据score从小到大的排名,下标从0开始。
5)zrevrank命令:同zrank,只是score的排序是从大到小:
6)zrange命令:获取指定区间(下标的区间)的元素,下标可以是负数。score是从小到大排序。
7)zrevrange命令:同zrange命令,只是score的排序是从大到小
8)zrangebyscore命令:获取score的值在某个区间的元素
9)zcount命令:获取score值在某个区间的元素的数量。
10)zcard命令:获取集合的元素的总数
11)zscore命令:获取元素的score值。
12)zremrangebyrank命令:删除排名在某个区间的元素:
13)zremrangebyscore命令:删除score值在某个区间的元素:
3、小结
1)zadd命令如果元素是已经存在的,会更新score值。
2)zrange、zrevrange的排名,最左边的下标值是0,最右边的下标值是-1
3)zremrangebyrank或zremrangebyscore是可以删减元素,用于排行榜之类的特别适用,维护一个数量固定的有序集合。
4)有序集合的元素个数还是不要存储太多,否则性能不好。