当前位置:网站首页>面试官:Redis中有序集合的内部实现方式是什么?
面试官:Redis中有序集合的内部实现方式是什么?
2022-07-06 12:45:00 【51CTO】
面试官:Redis中基本的数据类型有哪些?
我:Redis的基本数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
面试官:有序集合的内部实现方式是什么?
我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗。“这个。。没有太深入了解”,我支支吾吾的说到。
面试官:回去等消息吧。
这句话说的干净利落,然后就没有然后了。失败是成功的妈妈,我不气馁,决定马上恶补一下。
有序集合的内部实现
有序集合的内部实现有两种,分别是:压缩列表(ziplist)和跳跃表(skiplist)。接下来,我们分别进行详细的了解。
以压缩列表作为内部实现
当有序集合的元素个数小于zset-max-ziplist-entries
(默认为128个),并且每个元素成员的长度小于zset-max-ziplist-value
(默认为64字节)的时候,使用压缩列表作为有序集合的内部实现。
每个集合元素由两个紧挨在一起的两个压缩列表结点组成,其中第一个结点保存元素的成员,第二个结点保存元素的分支。压缩列表中的元素按照分数从小到大依次紧挨着排列,有效减少了内存空间的使用。
举个例子,我们使用zadd
命令创建一个以压缩列表为实现的有序集合:
以跳跃表作为内部实现
当有序集合的元素个数大于等于zset-max-ziplist-entries
(默认为128个),或者每个元素成员的长度大于等于zset-max-ziplist-value
(默认为64字节)的时候,使用跳跃表作为有序集合的内部实现。
此时,在有序集合中其实包含了两个结构,一个是跳跃表,另一个是哈希表。
在跳跃表中,所有元素按照从小到大的顺序排列。跳跃表的结点中的object
指针指向元素成员的字符串对象,score
保存了元素的分数。通过跳跃表,Redis可以快速地对有序集合进行分数范围、排名等操作。
在哈希表中,为有序集合创建了一个从元素成员到元素分数的映射。键值对中的键指向元素成员的字符串对象,键值对中的值保存了元素的分数。通过哈希表,Redis可以快速查找指定元素的分数。
虽然有序集合同时使用跳跃表和哈希表,但是这两种数据结构都使用指针共享元素中的成员和分数,不会额外的内存浪费。
举个例子,我们使用zadd
命令创建一个以跳跃表为实现的有序集合:
内部实现的转换
当一个有序集合是以压缩列表作为内部实现时,再向这个有序集合添加较长的元素成员,或向这个有序集合的元素个数过多时,那么这个有序集合就会转换为以跳跃表作为内部实现。但是,以跳跃表作为内部实现的有序集合不会转换为以压缩列表作为内部实现。
举个例子,我们先创建一个以压缩列表作为内部实现的有序集合:
然后,再向它添加一个较长成员的元素,它就是转换为以跳跃表作为内部实现:
然后,再把那一个较长成员的元素从有序集合中移除,有序集合依然是以跳跃表作为内部实现:
总结
在Redis中,有序集合的内部实现有压缩列表(ziplist)和跳跃表(skiplist)两种,当集合中的所有元素的成员长度较短并元素个数较少时,使用压缩列表作为内部实现,否则使用跳跃表和哈希表作为内部实现。当条件不满足时,压缩列表可以转换为跳跃表,但跳跃表不能转换为压缩列表。
竟然已经看到这里了,你我定是有缘人,留下你的点赞和关注,他日必成大器。
边栏推荐
- Kubernetes learning summary (20) -- what is the relationship between kubernetes and microservices and containers?
- Comprehensive evaluation and recommendation of the most comprehensive knowledge base management tools in the whole network: flowus, baklib, jiandaoyun, ones wiki, pingcode, seed, mebox, Yifang cloud,
- 【每周一坑】计算100以内质数之和 +【解答】输出三角形
- 动态切换数据源
- Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)
- 2022 nurse (primary) examination questions and new nurse (primary) examination questions
- 小孩子学什么编程?
- Summary of different configurations of PHP Xdebug 3 and xdebug2
- SAP UI5 框架的 manifest.json
- 1_ Introduction to go language
猜你喜欢
全网最全的新型数据库、多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、维格表 Vika、飞书多维表格、黑帕云、织信 Informat、语雀
SQL injection 2
Laravel notes - add the function of locking accounts after 5 login failures in user-defined login (improve system security)
Rhcsa Road
OLED屏幕的使用
Entity alignment two of knowledge map
1500萬員工輕松管理,雲原生數據庫GaussDB讓HR辦公更高效
使用.Net分析.Net达人挑战赛参与情况
[weekly pit] output triangle
“罚点球”小游戏
随机推荐
[diy] how to make a personalized radio
7. Data permission annotation
OAI 5G NR+USRP B210安装搭建
Quel genre de programmation les enfants apprennent - ils?
OLED屏幕的使用
Recyclerview GridLayout bisects the middle blank area
7、数据权限注解
R语言可视化两个以上的分类(类别)变量之间的关系、使用vcd包中的Mosaic函数创建马赛克图( Mosaic plots)、分别可视化两个、三个、四个分类变量的关系的马赛克图
【微信小程序】运行机制和更新机制
Is it safe to open an account in flush? Which securities company is good at opening an account? Low handling charges
Build your own application based on Google's open source tensorflow object detection API video object recognition system (IV)
(工作记录)2020年3月11日至2021年3月15日
Leetcode hot topic Hot 100 day 32: "minimum coverage substring"
SSO single sign on
Number of schemes from the upper left corner to the lower right corner of the chessboard (2)
How does kubernetes support stateful applications through statefulset? (07)
Extraction rules and test objectives of performance test points
Mtcnn face detection
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
Maximum likelihood estimation and cross entropy loss