当前位置:网站首页>【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
2022-07-06 12:51:00 【暮色_年华】
简单动态字符串:SDS
【Redis笔记】简单动态字符串(SDS)_暮色_年华的博客-CSDN博客_sds动态字符串
链表:linkedlist
【Redis笔记】数据结构与对象:链表_暮色_年华的博客-CSDN博客_对象链表
字典:hashtable、map
【Redis笔记】数据结构和对象:字典_暮色_年华的博客-CSDN博客
跳跃表:skiplist
【redis设计与实现】数据结构:跳跃表(skiplist)_暮色_年华的博客-CSDN博客
整数集合:intset
【redis设计与实现】数据结构:整数集合(intset)_暮色_年华的博客-CSDN博客
压缩列表:ziplist
【Redis笔记】压缩列表(ziplist)_暮色_年华的博客-CSDN博客
对象:
使用对象的好处:
(1)根据对象的类型来判断一个对象是否可以执行给定的指令
(2)可以针对不同的使用场景为对象设置多种不同的数据结构实现
对象的类型和编码:
Redis每个对象都由一个redisObject结构表示
type:记录对象的类型
Redis的键总是一个字符串对象。
encoding:决定对象的数据结构
好处:通过encoding属性来设定对象使用的数据结构,提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的数据结构,从而优化对象在某一场景的效率。
ptr指针:指向对象的底层实现的数据结构
字符串对象:
三种编码方式:int,raw,embstr
(1)如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性中,并将encoding设置为REDIS_ECODING_INT.
(2)如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用SDS来保存这个字符串值,并将对象的编码设置为REDIS_ENCODING_RAW
(3)如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象使用embstr编码的方式来保存这个字符串值。
说明:long double类型的浮点数在Redis中也作为字符串值来保存。浮点数<->字符串
编码转换:
int->raw:对象保存的不再是整数值
embstr->raw:由于embstr只读,如果对embstr执行任何的修改命令,程序首先将对象的编码从embstr转换为raw,然后执行修改命令。
列表对象:
两种数据结构实现方式:ziplist,linkedlist
1、使用ziplist实现时,每个压缩列表节点保存了一个列表元素。
2、使用linkedlist实现时,每个双端链表节点都保存了一个字符串对象,每个字符串对象都保存了一个列表元素。
字符串对象时Redis5种类型的对象种唯一一种会被其他四种类型对象嵌套的对象
编码转换:
哈希对象:
两种实现方式:ziplist,hashtable
1、使用ziplist实现时,每当有新的键值对加入哈希对象时,程序会先保存了键的节点加到表尾,然后把值的节点加到表尾
(1)同一个键值对的两个节点总是紧挨在一起
(2)先添加的键值对在表头,后添加的键值对在表尾。
2、使用hashtable实现时,键值对使用字典键值对保存。字典中的每个键和值都是一个字符串对象。
编码转化:
集合对象:
两种编码方式:intset,hashtable
1、使用intset时,集合对象的所有元素被保存在intset中。
2、使用hashtable时,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,值全部设为null
编码转换:
有序集合对象:
两种编码方式:ziplist,skiplist
1、使用ziplist时,每个集合使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,分支较大的元素被放置在表尾的方向。
2、使用skiplist时,使用zset结构实现,包括字典和跳跃表。
(1)跳跃表按分值从小到大保存了所有元素集合,每个跳跃表节点保存了一个集合元素:object属性保存成员,score保存分值。如果只使用字典,保持有序时间O(logn),空间O(n)
(2)字典为有序集合创建一个从成员到分值的映射,字典中 的每个键值对都保存了一个集合元素。可以通过O(1)查找给定成员的分值。如果只使用跳跃表,O(logn)
(3)zset结构同时使用跳跃表和字典来保存集合元素,但是它们通过指针来共享相同的元素的成员和分值。所以同时使用它们不会浪费额外的内存。
编码转换:
Redis对象的特性:
类型检查:
Redis用于操作键的命令可以分为两种:
可以对任何类型的键执行;只能对特定类型的键执行。
在执行一个类型特定的命令之前,Redis会检查键的类型,然后再决定是否执行命令。
命令多态:
Redis根据值对象的编码方式,选择合适的代码实现命令。
基于类型的多态:无论输入的键是什么类型,命令都可以正确的执行
基于编码的多态:一个命令可以同时用于处理多种不同的编码
内存回收:
Redis在对象系统中构建了一个引用计数实现内存回收机制,程序可以跟踪对象的引用计数信息,在适当时候自动释放对象并进行内存回收。
对象共享:
对象的引用计数可以实现对象共享。
在Redis中,让多个键共享同一个值的对象:
(1)让键的值指针指向一个现有的对象。
(2)将共享对象的引用计数加1
共享对象机制对于节约内存有帮助,保存相同值对象越多,对象共享机制就能节约越多内存。
(1)Redis会在初始化服务器时,创建0~9999所有整数值的字符串对象作为共享对象。
(2)Redis只对包含整数值的字符串对象进行共享
对象的空转时长:
边栏推荐
- 'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
- Redis insert data garbled solution
- Detailed explanation of knowledge map construction process steps
- 知识图谱构建流程步骤详解
- Manifest of SAP ui5 framework json
- C language games - three chess
- 性能测试过程和计划
- 3D人脸重建:从基础知识到识别/重建方法!
- 什么是RDB和AOF
- 966 minimum path sum
猜你喜欢
Pinduoduo lost the lawsuit, and the case of bargain price difference of 0.9% was sentenced; Wechat internal test, the same mobile phone number can register two account functions; 2022 fields Awards an
知识图谱之实体对齐二
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,
Infrared thermometer based on STM32 single chip microcomputer (with face detection)
面试官:Redis中有序集合的内部实现方式是什么?
SAP Fiori应用索引大全工具和 SAP Fiori Tools 的使用介绍
[200 opencv routines] 220 Mosaic the image
15 millions d'employés sont faciles à gérer et la base de données native du cloud gaussdb rend le Bureau des RH plus efficace
每个程序员必须掌握的常用英语词汇(建议收藏)
Aiko ai Frontier promotion (7.6)
随机推荐
What key progress has been made in deep learning in 2021?
Spiral square PTA
Data Lake (VIII): Iceberg data storage format
快过年了,心也懒了
【微信小程序】运行机制和更新机制
MLP (multilayer perceptron neural network) is a multilayer fully connected neural network model.
Build your own application based on Google's open source tensorflow object detection API video object recognition system (IV)
审稿人dis整个研究方向已经不仅仅是在审我的稿子了怎么办?
Taylor series fast Fourier transform (FFT)
Solution to the 38th weekly match of acwing
SAP UI5 框架的 manifest.json
[DIY]自己设计微软MakeCode街机,官方开源软硬件
15 millions d'employés sont faciles à gérer et la base de données native du cloud gaussdb rend le Bureau des RH plus efficace
967- letter combination of telephone number
LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件
[MySQL] basic use of cursor
Select data Column subset in table R [duplicate] - select subset of columns in data table R [duplicate]
Xcode6 error: "no matching provisioning profiles found for application"
Aiko ai Frontier promotion (7.6)
字符串的使用方法之startwith()-以XX开头、endsWith()-以XX结尾、trim()-删除两端空格