Redis基本类型中的有序集sorted set

举报
多米诺的古牌 发表于 2022/02/24 15:51:47 2022/02/24
【摘要】 1.sorted set类型是去重且会对元素进行元素操作的sorted set,sorted set相对于其他类型会多一个分值的维度,用来进行元素的排序操作。1.1 zaddsorted set类型添加元素使用的指令是zadd 排序的分值1 key1 排序的分值2 key2... ...1.2 zrange和zrevrange通过zrange key 开始索引位 结束索引位 withscor...

1.sorted set类型

是去重且会对元素进行元素操作的sorted set,sorted set相对于其他类型会多一个分值的维度,用来进行元素的排序操作。

1.1 zadd

sorted set类型添加元素使用的指令是zadd 排序的分值1 key1 排序的分值2 key2... ...

1.2 zrange和zrevrange

通过zrange key 开始索引位 结束索引位 withscores的指令进行查看,如果不加withscores参数则只会显示所有的元素,加上则会将分值和元素都显示出来

在取出最低分值的前两名的时候,可以使用zrange正序排列后取出前两名;如果取出取出最高分值的前两名的时候,可以使用zrevrange逆序排列后取出前两名;

由此可以看出sorted set中的元素是物理内存中左小右大的顺序进行存储,不会随着命令而发生变化,因此查询时根据需求的不同需要选择不同的指令进行查询。

下图很明显可以看出如果用正序 使用逆向索引的方法求结果,并不是想要的结果,因为集合不会随着命令发生变化。

正确的结果求法:

错误顺序的求法:

1.3 zrangebyscore

zrangebyscore是取符合自定义分值范围内的元素,指令为zrangebyscore key 开始分值 结束分值

1.4 zscore

通过zscore key 元素指令来查看该元素对应的分值

1.5 zrank

通过zrank key 元素指令来查看该元素对应的排名

1.6 zincrby

zincrby是可以对原有元素中的分值进行计算操作,并且计算完会进行重新排序,使用指令是zincrby key 需要修改的分值变量 需要修改的元素,使用场景可以是不同变化的排行榜(比如根据点击量、收藏量等不断变化后的也会随之变化的排行榜)

1.7 zunionstore

zunionstore是计算给定的一个或多个有序集的并集,指令是zunionstore 任意设定的变量 需要计算几个集合 集合1 集合2 计算方法(默认为sum求和)

下图为加权重的指令是zunionstore 任意设定的变量 需要计算几个集合 集合1 集合2 weights 集合1的权重值 集合2的权重值 计算方法(默认为sum求和)

下图为取最大的指令是zunionstore 任意设定的变量 需要计算几个集合 集合1 集合2 aggregate max,取两个集合中各个元素最大的分值

1.8 sorted set的排序是怎么实现的

为什么crud的速度会非常快,因为sorted set使用了一种skip list跳跃表模式,最开始他会随机建层,最下层为原始数据层,随机到如果有下一层则随机抽取数按顺序排列(元素比原始层少),再随机看有没有下一层,如果有继续随机抽元素放在这层,也是比上一层元素少。

1.8.1 新增

当插入的时候会从顶层开始比较分值,然后放到左边或者右边,然后再放到下一层比较分值,因为元素是上面少下面多的,所以能快速比较分值,定位元素应该放的位置,最后将元素定位到最下层原始层中,结束定位后会修复定位后左右元素的指针,让指针断开然后重新完成加入后的指向,比如原来是 1==》3,插入2后修复指针变为 1==》2==》3。

1.8.2 修改

原理和新增一样,只是将元素移出后,重新进行插入,最后将对于的指针进行修复

1.8.3 删除

是将元素移出后,修复对应的指针

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。