zset为有序的(优先按score,score相同按元素字典序),自动去重的集合类型
底层结构
- ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
- dict(字典)和skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。
与ziplist不同的是,使用两个entry表示一个元素,一个用来存值,一个存score
示意图:
跳表(底层为链表)数据结构
查询方法类似二分
typedef struct zset {
dict *dict; // 字典
zskiplist *zsl; // 跳表
} zset;
typedef struct zskiplist {
struct zskiplistNode *header, *tail; // 跳表节点
unsigned long length; // 跳表中包含的元素
int level; // 最大的层高
} zskiplist;
typedef struct zskiplistNode {
sds ele; // 元素
double score; // 分值
struct zskiplistNode *backward; // 尾结点
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned int span;
} level[];
} zskiplistNode;
应用场景
排行榜
sorted set 类型
1.zadd :添加
2.zscore: 查看某个值的分数
3.zrange : key start end withscores 按照分数排序
4.zrem:删除
5.zincrby key score value :给某个值加分数