redis 对象
redis通过前面几篇的数据结构构键了一个对象系统,这个对象系统包含了字符串对象,列表对象,哈希对象,集合对象,有序集合对象
每一个对象都是一个redisobject
typedef struct redisObject { // 类型
unsigned type:; // 编码
unsigned encoding:; // 指向底层实现数据结构的指针
void *ptr; // ... } robj;
type表示类型,有5种,就是
REDIS_STRING,REDIS_LIST,REDIS_HASH,REDIS_SET,REDIS_ZSET
编码表示的就是底层的实现,因为每一种对象都至少有两种以上的实现方式。ptr指向的就是底层实现的数据结构
字符串对象的编码可以是int,raw,embstr
int针对的是整数
如果字符串的长度小于39,那么使用embram,否则使用raw
embstr和raw的区别
(1)embstr是连续的,object和sds是一块连续的内存,这样的话分配内存和释放内存都不是两次,而是一次
(2)充分利用缓存的优势
double类型其实也是字符串类型的
当时用的时候会从字符串类型转换为double类型
int和embstr在满足条件的时候都会转换为raw编码,比如一个整数10085 appending一个字符串的话就不在是一个整数了
另外embsr不可以修改的,他是只读的,如果要修改的话,他会自动转换为raw之后再进行修改
列表对象:
列表对象的编码可以使压缩列表和双端链表,如果其中有字符串的话,字符串是字符串对象的表示,说明字符串对象可以被其他的对象嵌套
编码转换
(1)每一个元素得长度都小于64,
(2)数量小于512,
满足上面两个条件的话就是用压缩列表,否则的话使用双端链表
哈希对象
哈希对象的编码可以是压缩列表和字典
如下图所示
至于编码的转换,和上面的是一样的,如果两个都满足,就使用压缩列表,否则使用字典
ps:注意这两个限制条件在redis.conf的配置文件中是可以修改的
集合对象:
集合对象的编码可以是整数集合和hashtable
看下面:
编码的转换条件
(1)都是整数
(2)元素数量不超过512个
满足以上条件使用整数集合,否则的话使用hashtable
有序集合对象:
编码可以是压缩列表和跳跃表
压缩列表实现的话,使按照分值排序,并且存储的话对象在前,分值在后
zset中基于跳跃表实现的话,就是讲分值从小到大排序,建立一个跳跃表,但是额外还需要一个字典,记录对象和分值的映射,这样的话对于ZSCORE命令,我们可以在O(1)的时间复杂度就可以获得到指定对象的分值
两者结合,无论是有序遍历还是获得指定元素,都会择优选择,降低时间复杂度
编码转换
(1)长度都小于64
(2)数量不超过128个
这两个都满足就是用压缩列表,否者就是用skiplist作为编码
额外对于对象还有很多优化和处理
(1)多态:很多命令都是具有多态的性质,就是可以处理多种命令
在执行一个命令的时候,我们首先会根据值对象的类型去判断这个命令能否执行,如果可以的话,我们还会根据值对象的编码方式选择正确的API去执行
比如上面,我们就可以认为LLEN是多态的,多态可以包括基于类型的多态,和基于编码的多态
(2)内存管理:
对于redisobject我们基于引用计数原值,定义在redisobject结构里面的refcount int,当对象引用计数降低为0的时候,释放对象。这个有点类似windows线程回收机制,采用计数原值,关闭handle减一,线程函数退出减一,为0的时候自动回收线程资源
(3)对象共享:
redis中多个键的值一样的话,会使值指针只想一块内存,引用计数增加,redis服务器初始化的时候会默认创建0-9999字符串,所以他们的引用计数在还没使用的时候就是1了
(4)空转时长:
redisobject中有个lru,表示最后访问的时候
通过idletime可以求出多久没有被访问了,就是当前时间和lru时间差(空转时长)
但是ps(这个命令不会修改lru属性)
如果服务器设置了maxmemory选项,那么当内存达到上线了,服务器会优先空转时间长的进行释放
redis 对象的更多相关文章
- 【redis源码阅读】redis对象
结构定义 在redis中,对象的数据结构定义如下: typedef struct redisObject { unsigned type:4; unsgined encoding:4; uns ...
- Redis对象类型
Redis对象类型 Redis基于基础的数据结构创建的对象: 字符串对象. 列表对象. 哈希对象. 集合对象 有序集合对象. 对象回收:Redis对象系统实现了基于引用计数技术的内存回收机制,当程序不 ...
- Redis底层探秘(五):Redis对象
前面几篇文章,我们一起学习了redis用到的所有主要数据结构,比如简单动态字符串(sds).双端链表.字典.压缩列表.整数集合等等. redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这 ...
- Redis对象的设计与实现
一.Redis对象结构Redis中的每个对象都由一个redisObject结构表示: typedef struct redisObject { unsigned type;//类型 unsigned ...
- 面试官:你了解过Redis对象底层实现吗
上一章我们讲了Redis的底层数据结构,不了解的人可能会有疑问:这个和平时用的五大对象有啥关系呢?这一章我们就主要解释他们所建立的联系. 看这个文件之前,如果对ziplist.skiplist.int ...
- Redis之对象篇——Redis对象系统简介
Redis之对象篇--Redis对象系统简介 前言 之前几篇文章,简单介绍 Redis用到的所有主要数据结构,简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合.跳跃表. 图解Red ...
- Redis对象——字符串
文章导航-readme 前言 上一篇文章Redis之对象篇--Redis对象系统简介简单介绍了Redis的对象系统.Redis使用对象来表示数据库中的键和值每个对象都由一个redisObjec ...
- Redis对象
概述 Redis并没有使用基础数据结构去实现键值数据库,而是基于数据结构封装了一个个对象. 类型和编码 由于Redis是键值数据库,所以每次存储数据时,至少包含两个对象,即K.V对应的对象.其数据结构 ...
- Redis对象占用内存分析
当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...
随机推荐
- 使用Dotfuscator加密混淆程序以及如何脱壳反编译
混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AE ...
- 【持续集成】GIT+jenkins+snoar——GIT
一.GIT基础 1.1 git简介 linux用C语言编写 2005年诞生 分布式管理系统 速度快.适合大规模.跨地区多人协同开发 1.2 本地管理.集中式.分布式 1.3 git安装 #CentOS ...
- 深入Java集合学习系列:Hashtable的实现原理
第1部分 Hashtable介绍 和HashMap一样,Hashtable也是一个散列表,它存储的内容是键值对(key-value)映射.Hashtable继承于Dictionary,实现了Map.C ...
- vim - manual -个人笔记
##vim配置 ###normal > 输入命令:w 写入保存 > > 粘贴 :p(向下粘贴) P(大写向上粘贴) > > 复制 :yy 复制一行 > > 删 ...
- Python爬虫学习之获取网页源码
偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...
- SpringMVC中使用@Value给非String类型注入值
String类型的@Value注入方式 String类型的直接可以使用 @Value("陈婉清") private String name; 非String类型的@Value注入方 ...
- Intellij Shortcuts
ctrl+shift+F : search in whole project ctrl+hover : check the field info in brief ctrl+Q : check the ...
- Ultimus BPM 房地产与建筑行业应用解决方案
Ultimus BPM 房地产与建筑行业应用解决方案 行业应用需求 房地产与建筑行业客户业务特点是集团化管控,多区域.多项目.多业态管理,而行业业务往往项目周期长,涉及专业复杂,客户越来越重视管理和跟 ...
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
记得很久以前的一个面试场景: 面试官:说说你对JavaScript闭包的理解吧? 我:嗯,平时都是前端工程师在写JS,我们一般只管写后端代码. 面试官:你是后端程序员啊,好吧,那问问你多线程编程的问题 ...
- NFS文件共享
NFS文件共享 简介 NFS即网络文件系统(network file system),监听在TCP 2049端口. 服务器需要记住客户端的ip地址以及相应的端口信息,这些信息可以委托给RPC(remo ...