有序集合对象 - 《Redis设计与实现》读书笔记
时间:2021-08-11
本文章向大家介绍有序集合对象 - 《Redis设计与实现》读书笔记,主要包括有序集合对象 - 《Redis设计与实现》读书笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有序集合对象的编码可以是ziplist或者skiplist
- ziplist编码的有序集合对象使用压缩列表作为底层实现
每个集合元素使用两个紧挨在一起的压缩列表节点来保存
第一个节点保存元素的成员,第二个节点保存元素的分值
压缩列表内的集合元素按分值从小到大进行排序
分值较小的元素被放置在靠近表头的方向,分值较大的元素被放置在靠近表尾的方向
- skiplist编码的有序集合对象使用zset结构作为底层实现
// zset结构
typedef struct zset {
// 字典: 创建一个从成员到分值的映射,凭此用O(1)复杂度查找给定成员的分值
// 字典中的每个键值对保存了一个集合元素: 字典的键保存元素的成员,字典的值保存元素的分值
dict *dict;
// 跳跃表: 按分值从小到大保存集合元素,凭此对有序集合进行范围型操作
// 每个跳跃节点都保存一个集合元素: 跳跃节点的ele属性保存了元素的成员,跳跃节点的score属性保存了元素的分值
zskiplist *zsl;
} zset;
有序集合需要同时使用跳跃表和字典来实现的原因:
- 若只使用字典来实现有序集合,由于字典以无序的方式保存集合元素,每次在执行范围型操作需要对所有元素进行排序,这一过程至少O(NlogN)时间复杂度以及额外的O(N)内存空间
- 若只使用跳跃表来实现有序集合,根据成员查找分值这一操作的复杂度将从O(1)上升为O(logN)
综上所述,无论单独使用字典还是跳跃表,在性能上对比同时使用字典和跳跃表都有所降低,所以Redis选择了同时使用字典和跳跃表两种数据结构实现有序集合注意: 字典和跳跃表会共享元素的成员和分值,并不会造成数据容与,也不会造成内存浪费
编码转换
当有序集合对象可以【同时满足】以下条件时,有序集合对象的编码使用ziplist,否则使用skiplist编码,
- 有序集合对象保存的元素数量小于128个
- 有序集合对象保存的所有元素成员的长度都小于64字节
编码的转换两个条件的上限值可通过配置文件中的zset-max-ziplist-entries、zset-max-ziplist-value选项进行调整,
源码阅读
- 文件:src/t_zset.c
原文地址:https://www.cnblogs.com/phonecom/p/15129320.html
- mongodb-基础-update-remove
- Mybatis-mapper-xml-基础
- 2016.06 第一周 群问题分享
- MongoDB - basic
- spring boot启用tomcat ssl
- HTTP status code
- jackson简单使用,对象转json,json转对象,json转list
- 2016.07 第3周 群问题分享
- jackson error 含义log
- java删除文件夹
- JSP自定义tag
- gradle中使用嵌入式(embedded) tomcat, debug 启动
- spring in action 4th --- quick start
- Date, TimeZone, MongoDB, java中date的时区问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法