redis之redisObject对象
redisObject对象
无论什么数据类型,redis都是以key-value形式保存,并且所有的key都是字符串
redis每存储一条数据,都会生成一个redisObject对象,通过redisObject对象来表示存储的数据
redisObject对象是联结外部数据类型和redis底层数据结构的桥梁,其实是指向底层数据结构
redisObject对象至少包括:
1) 用来描述具体数据的类型
2) 存储的具体数据
1 redisObject对象的底层结构
结构如下:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;
其中:
type:数据类型,占4bit,目前包括:REDIS_STRING(字符串)、REDIS_LIST(列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)
encoding:储存的具体数据对应的redis底层编码,占4bit
lru:对象最后一次被访问的时间,用于redis内存回收算法淘汰key
refcount:引用计数,允许redisObject对象在某些情况下被共享
ptr:指向数据的指针,实际指向数据类型对应的底层数据结构
2 redisObject对象示意图

3 使用redisObjec对象的好处
1) 执行redis命令时,可以通过redisObject 的type和encoding属性来确定是否可以执行相应的命令,不用等操作具体的数据时才发现命令不可执行
2) 同一数据类型可以使用不同的底层编码,优化不同场景下的使用效率和节省内存
3) 支持共享和引用计数。当对象被共享时,只占用一份内存拷贝,节省内存
4) 根据lru属性并结合redis内存回收算法淘汰长时间未使用的key
4 type,encoding,数据类型和底层数据结构的关系
相同的type,可能对应不同的encoding:同一个数据类型,redis使用了不同的底层数据结构,导致在内存占用和查找性能上会有所不同
redis中每种数据类型都会有至少对应2种底层数据结构
| type | redis数据类型 | 编码 | encoding | 底层数据结构 |
| REDIS_STRING | String(字符串) | int | REDIS_ENCODING_INT | long型整数的简单动态字符串 |
| REDIS_STRING | String(字符串) | embstr | REDIS_ENCODING_EMBSTR | embstr编码的简单动态字符串 |
| REDIS_STRING | String(字符串) | raw | REDIS_ENCODING_RAW | 简单动态字符串 |
| REDIS_LIST | List(列表) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_LIST | List(列表) | linkedlist | REDIS_ENCODING_LINKEDLIST | 双向链表 |
| REDIS_SET | Set(集合) | intset | REDIS_ENCODING_INTSET | 整数集合 |
| REDIS_SET | Set(集合) | hashtable | REDIS_ENCODING_HT | 字典 |
| REDIS_ZSET | Sorted Set(有序集合) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_ZSET | Sorted Set(有序集合) | skiplist | REDIS_ENCODING_SKIPLIST | 跳表+字典 |
| REDIS_HASH | Hash(哈希) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
| REDIS_HASH | Hash(哈希) | hashtable | REDIS_ENCODING_HT | 字典 |
redis之redisObject对象的更多相关文章
- Redis源代码剖析--对象object
前面一系列的博客分析了Redis的基本数据结构,有动态字符串sds.双端链表sdlist.字典dict.跳跃表skiplist.整数集合intset和压缩列表ziplist等,这些数据结构对于用户来说 ...
- Redis学习之对象系统源码分析
背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...
- Redis 学习笔记(一)redis 数据类型和对象机制
Redis 简介 Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 value 可以是 String.hash.list.set.zset(有序集 ...
- Redis数据结构与对象
参考<Redis设计与实现> 系列文章目录和关于我 一丶简单动态字符串 当redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,就会使用SDS(simple dynam ...
- redis 序列化存入对象
redis 序列化存入对象 //序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteAr ...
- redis 存储java对象 两种方式
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用redi ...
- Redis如何存储对象与集合示例详解
前言 大家都知道在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异 ...
- 关于Spring Data redis几种对象序列化的比较
redis虽然提供了对list set hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的.因此,Spring data提供了若干个Seriali ...
- 面试官:Redis的共享对象池了解吗?
我正在面试间里焦急地等待着,突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来. 面试官:"平时在工作中用过Redis吗?" 我:&q ...
- redis源码解析(1):redisObject对象说明
Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构. redis3.0 中对象结构: typedef struct redi ...
随机推荐
- Dilworth
Dilworth 定理 偏序集能划分成的最少的全序集个数等于最大反链的大小. 名词解释 偏序 在集合 \(S\) 中定义的二元关系 \(\le\),如果它满足以下三个性质: 自反性:\(\forall ...
- el-scrollbar滚动加载
mounted() { 监听滚动条 this.$refs.scrollbar.wrap.addEventListener("scroll", this.scrollCo ...
- python web自动化-文件上传-亲身实践
文件上传三种方式: (一)查看元素标签,如果是input,则可以参照文本框输入的形式进行文件上传 方法:和用户输入是一样的,使用send_keys 步骤:1.找到定位元素,2,输入文件路径 ele=d ...
- npm升级报错,没有权限.ERRERR!The operation was rejected by your operating system. npm ERR!Error: EPERM: operation not permitted, rename
问题描述 Windows system32>npm installg npm 2335 error code EEXIST2336 error path D:\Program Files\nod ...
- CompletableFuture事务问题
前段时间写了关于CompletableFuture的使用博客,CompletableFuture使用方法详细说明 和 CompletableFuture的thenCompose使用具体说明. 但在实际 ...
- JavaScript 对象操作
Object.defineProperty(obj, prop, descriptor)方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象. const freezeO ...
- Selenium私房菜系列8 -- 玩转Selenium Server【OO】
本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始. 在<第一个Selenium RC测试案例>中,我们以命令&quo ...
- springboot启动类剔除扫描某个包
// 排除api中不引数据库导致的报错包 @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX ...
- (0409) Pycharm 的设置--参数设置(运行.py文件带参数,例如argument) 比如: demo.py -prj xxx
1) https://www.cnblogs.com/yksgzlyh/p/10221960.html 点击"Run"菜单下的"Edit Configurations. ...
- linux 软链接 硬链接 区别
来源 https://www.cnblogs.com/oceanftd/p/13475643.html 相关概念: 链接:简单说,链接就是一种文件共享的方式,是POSIX中的概念,主流文件系统都支持 ...