Redis知识整理(六) – Sorted Set/ZSet类型
一、类型特征
去重且排序
set保证去重
排序指的是值的排序
物理内存为左小右大
二、数据类型
key - value
value的类型为zset
则代表value的元素需要一个score(分数),作为排序的基准
同时索引依然正常存在 – 正负索引 0/-3 1/-2 2/-1
score都为1的情况下 按照名称排序
三、常用命令
> zadd 8 apple 2 banana 3 orange
(integer) 3
> zrange k1 0 -1
1) "banana"
2) "orange"
3) "apple"
> zrange k1 0 -1 withscores
1) "banana"
2) "2"
3) "orange"
4) "3"
5) "apple"
6) "8"
> zrangebyscore k1 3 8
1) "orange"
2) "apple"
> zrevrange k1 0 1
1) "apple"
2) "orange"
> zscore k1 apple
"8"
> zrank k1 apple
(integer) 2
> zincrby k1 2.5 banana
"4.5"
> zrange k1 0 -1 withscores
1) "orange"
2) "3"
3) "banana"
4) "4.5"
5) "apple"
6) "8"
> flushall
> zadd k1 80 tom 60 sean 70 baby
> zadd k2 60 tom 100 sean 40 xxoo
> zunionstore k3 2 k1 k2
(integer) 4
> zrange k3 0 -1 withscores
1) "xxoo"
2) "40"
3) "baby"
4) "70"
5) "tom"
6) "140"
7) "sean"
8) "160"
> zunionstore k4 2 k1 k2 weights 1 0.5
(integer) 4
> zrange k4 0 -1 withscores
1) "xxoo"
2) "20"
3) "baby"
4) "70"
5) "tom"
6) "110"
7) "sean"
8) "110"
> zunionstore k5 2 k1 k2 aggregate max
(integer) 4
> zrange k4 0 -1 withscores
1) "xxoo"
2) "40"
3) "baby"
4) "70"
5) "tom"
6) "80"
7) "sean"
8) "100"
四、注意事项
1. 取值方向
zrange 一定是从小到大取结果
zrevrange则是从大到小取结果
2. 集合运算
运算方式默认是累加
- 可以配置 aggregate sum|min|max
权重默认是1
- 配置weights的话 对应key的所有score都??权重
五、应用场景
1. 排行榜
利用zset存储 zrevrange倒序取 score即为播放量
六、数据结构 – 跳表(skiplist)
链表基础上的封装
每一个链表元素中除了存储前后节点的指针之外,还存储了向上的指针,指向上一级
每一级元素数量比上层少 比下层多,有点类似于二叉树的左右叶子节点
每一级元素之间通过指针指向
新的元素插入时,从上至下依次寻找左右元素,直到最下一层找到对应位置,修改前后节点指针并指向前后节点
每个新元素插入时,随机造层
空间换时间
平均值相对二叉树 红黑树更稳定
|