Redis知识整理(六) -- Sorted Set/ZSet类型

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"

# 根据score取结果
> zrangebyscore k1 3 8 
1) "orange"
2) "apple"

# 反方向取结果 rev代表反方向
> 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
# 权重默认是1 score累加
> zrange k3 0 -1 withscores
1) "xxoo"
2) "40"
3) "baby"
4) "70"
5) "tom"
6) "140"
7) "sean"
8) "160"

# 权重k1为1 k2为0.5 score加
> 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"

# 不配置权重 配置score处理方式
> 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)

链表基础上的封装

每一个链表元素中除了存储前后节点的指针之外,还存储了向上的指针,指向上一级

每一级元素数量比上层少 比下层多,有点类似于二叉树的左右叶子节点

每一级元素之间通过指针指向

新的元素插入时,从上至下依次寻找左右元素,直到最下一层找到对应位置,修改前后节点指针并指向前后节点

每个新元素插入时,随机造层

空间换时间

平均值相对二叉树 红黑树更稳定

在这里插入图片描述


版权声明:本文为baidu_38900596原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。