Redis基本类型中的有序集sorted set
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 删除
是将元素移出后,修复对应的指针
- 点赞
- 收藏
- 关注作者
评论(0)