同一份数据,Redis为什么要存两次 (4)

zrangebyscore key min max:返回有序集合中按 score 从小到大排列后在 [min,max] 区间的所有元素。注意这里默认是闭区间,但是可以在 max 和 min 的数值前面加上 ( 或者 [ 来控制开闭区间

zrevrangebyscore key max min:返回有序集合中按 score 从大到小排列后在 [min,max] 区间的所有元素。注意这里默认是闭区间,但是可以在 max 和 min 的数值前面加上 ( 或者 [ 来控制开闭区间

zrank key member:返回有序集合中 member 中元素排名(从小到大),返回的结果从 0 开始计算。

zrevrank key member:返回有序集合中 member 中元素排名(从大到小),返回的结果从 0 开始计算。

zlexcount key min max:返回有序集合中 min 和 max 之间的 member 数量。注意这个命令中的 min 和 max 前面必须加 ( 或者 [ 来控制开闭区间,特殊值 - 和 + 分别表示负无穷和正无穷。

了解了操作有序集合对象的常用命令,我们就可以来验证下前面提到的哈希对象的类型和编码了,在测试之前为了防止其他 key 值的干扰,我们先执行 flushall 命令清空 Redis 数据库。

在执行命令之前,我们先把配置文件中的参数 zset-max-ziplist-entries 修改为 2,然后重启 Redis 服务。

重启完成之后依次执行如下命令:

zadd name 1 zs 2 lisi //设置 2 个元素会使用 ziplist type name //查看类型 object encoding name //查看编码 zadd address 1 beijing 2 shanghai 3 guangzhou 4 shenzhen //设置4个元素则会使用 skiplist编码 type address //查看类型 object encoding address //查看编码

得到如下效果:

同一份数据,Redis为什么要存两次

总结

本文主要分析了集合对象和有序集合对象的底层存储结构 intset 和 skiplist 的实现原理,并且重点分析了有序集合如何实现排序以及为何同时使用两种数据结构(字典和跳表)同时进行进行存储数据的原因。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssdxp.html