Redis读书笔记(二)
Redis对象系统
Redis对象
- 字符串(String)的底层实现方式
- 直接保存整数值:字符串对象保存的是整数值,且可以用long类型来表示。
- embstr编码的SDS:字符串对象保存的是一个长度小于等于39字节的字符串值。
- SDS:字符串对象保存的是一个长度大于39字节的字符串值。
- 列表(List)的底层实现方式
- 压缩列表:列表对象保存的所有字符串元素的长度都小于64字节,且元素数量小于152个(注意:上限值是可以修改的,其他对象的上限值也是同洋的道理)。
- 双端链表:不满足压缩列表的使用条件,则使用双端链表。
- 哈希(Hash)的底层实现方式
- 压缩列表:哈希对象保存的所有键值对的键和值的字符串长度都小于64字节,且键值对数量小于512个。
- 字典:不满足压缩列表的使用条件,则使用字典。
- 集合(Set)的底层实现方式
- 整数集合:集合对象保存的所有元素都是整数,且元素数量不超过512个。
- 字典:不满足整数集合的使用条件,则使用字典。
- 有序集合(Zset)的底层实现方式
- 压缩列表:有序集合保存的元素数量小于128个,且所有元素的长度都小于64字节。
- 跳跃表+字典:不满足压缩列表的使用条件,则使用跳跃表+字典
Redis对象的实现
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 指向底层数据结构的指针
void *ptr;
// 引用计数
int refcount;
// 最后一次被命令程序访问的时间
unsigned lru:8;
//...
} robj;
对象的类型属性Type
| 类型常量 | 对象的名称 |
|---|---|
| REDIS_STRING | 字符串对象 |
| REDIS_LIST | 列表对象 |
| REDIS_HASH | 哈希对象 |
| REDIS_SET | 集合对象 |
| REDIS_ZSET | 有序集合对象 |
对象的编码属性Encoding和底层实现
| 类型 | 编码 | 对象 |
|---|---|---|
| REDIS_STRING | REDIS_ENCODING_INT | 使用整数值实现的字符串对象 |
| REDIS_STRING | REDIS_ENCODING_EMBSTR | 使用embstr编码的简单动态字符串实现的字符串对象 |
| REDIS_STRING | REDIS_ENCODING_RAW | 使用Simple Dynamic String实现的字符串对象 |
| REDIS_LIST | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的列表对象 |
| REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 使用双端链表实现的列表对象 |
| REDIS_HASH | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的哈希对象 |
| REDIS_HASH | REDIS_ENCODING_HT | 使用字典实现的哈希对象 |
| REDIS_SET | REDIS_ENCODING_INTSET | 使用整数集合实现的集合对象 |
| REDIS_SET | REDIS_ENCODING_HT | 使用字典实现的集合对象 |
| REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的有序集合对象 |
| REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 使用跳跃表和字典实现的有序集合对象 |
为什么需要同时使用跳跃表和字典来实现有序集合?
- 只使用字典来实现:执行查找的时间复杂度为O(1),但是执行范围性查询操作如ZRANGE、ZRANK等,需要对字典保存的所有元素排序,至少需要O(NlogN)的时间,以及额外的O(N)空间。
- 只使用跳跃表来实现:执行范围性查询的优点会被保留,但执行查找的时间复杂度为O(logN)。
所以为了查找和范围性查询都有尽可能快的执行,同时使用字典和跳跃表实现。
内存回收
对象的引用计数会随着对象的使用状态而不断变化:
- 当创建一个新对象时,引用计数的值被初始化为1
- 当对象被一个新程序使用时,引用计数的值会加1
- 当对象不再被一个程序使用时,引用计数的值会减1
- 当对象的引用计数变为0时,对象所占的内存会被释放
对象共享
Redis中让多个键共享同一个值对象(节约内存):
- 将key的值指针指向一个现有的对象
- 将被共享的值对象的引用计数加1
Redis只对包含整数值的字符串对象进行共享:
当共享对象时,首先需要检查给定的共享对象和想创建的目标对象是否完全一致,只有在共享对象和目标对象完全相同的情况下才会使用共享对象。
- 如果共享的是保存整数值的字符串对象,那么验证是否一致的时间复杂度为O(1)
- 如果共享的是保存字符串的字符串对象,那么验证是否一致的时间复杂度为O(N)
- 如果共享的是包含了多个值的对象,那么验证是否一致的时间复杂度为O(N*2)
所以考虑到CPU时间的限制,Redis只对包含整数的字符串对象进行共享。
Redis读书笔记(二)的更多相关文章
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- 《你必须知道的.NET》读书笔记二:小OO有大原则
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...
- spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...
- ES6读书笔记(二)
前言 前段时间整理了ES6的读书笔记:<ES6读书笔记(一)>,现在为第二篇,本篇内容包括: 一.数组扩展 二.对象扩展 三.函数扩展 四.Set和Map数据结构 五.Reflect 本文 ...
- spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定
本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...
- redis相关笔记(二.集群配置及使用)
redis笔记一 redis笔记二 redis笔记三 1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置 在上述8333配 ...
- [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串
本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...
- 【记】《.net之美》之读书笔记(二) C#中的泛型
前言 上一篇读书笔记,很多小伙伴说这本书很不错,所以趁着国庆假期,继续我的读书之旅,来跟随书中作者一起温习并掌握第二章的内容吧. 一.理解泛型 1.为什么要使用泛型?-----通过使用泛型,可以极大地 ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- how tomcat works 读书笔记(二)----------一个简单的servlet容器
app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...
随机推荐
- centos7 redis 无法用 systemctl 启动
今天刚安装了redis,修改了 /etc/redis.conf 的内容. 尝试在 bind 后添加一个地址 "bind 127.0.0.1 -::* 192.168.2.1", 后 ...
- windows IIS http 自动转https
1.安装url重写组件 https://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads 2.刷新IIS 3.添加规则
- django_设计模式和模板层
一.django的设计模式 1.传统MVC设计模式 (1)MVC(Model-View-Controller,模型-视图-控制器)模式. M--模型层,主要用于对数据库的封装: V--视图层,用于向用 ...
- sqlite bundle 的含义,和 sqlite.dll, SQLite.Interop.dll, System.Data.SQLite.dll 三者之间的关系
sqlite bundle 的含义,和 sqlite.dll, SQLite.Interop.dll, System.Data.SQLite.dll 三者之间的关系. bundle 表示不需要配合 S ...
- matlab解析毫米波雷达bin文件数据 得到复数
来源:TI提供的Mmwave Radar Device ADC Raw Data Capture %%% This script is used to read the binary file pro ...
- day47-Mysql初识
1.数据库的演变过程-- 文件存储(不同用户之间数据格式不一致,杂乱)==> 软件开发目录规范(限定了储存的具体位置,不能网络通信)==>数据库 数据库就是一款基于网络通信操作文件的应用程 ...
- vlan概述
一.vlan是什么? vlan顾名思义就是虚拟局域网Virtual Local Area Network,为什么要划分vlan?划分vlan可以控制广播,增强网络安全性,简化网络管理. 二.vlan的 ...
- 👋 和我一起学【Three.js】「初级篇」:0. 总论
「和我一起学 XXX」是我 2023 年的一个新企划,目的是向读者(也包括未来的自己)介绍我正在学习的某项新技术.文章会通过长期反复迭代的方式保持其内容的新鲜度.文章有较大内容更新时,会在文章开头进行 ...
- Android笔记--文本显示
文本显示 设置文本内容 方式一: 在.xml文件中利用android:text属性设置文本 新创建一个.xml文件示范一下: 方式二: 在java代码中调用文本视图对象的setText方法设置文本 还 ...
- 实践Pytorch中的模型剪枝方法
摘要:所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差的模型压缩技术. 本文分享自华为云社区<模型压缩-pytorch 中的模型剪枝方法实践>,作者:嵌入式 ...