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 ...
随机推荐
- Ubuntu下安装Node.js+ThreeJs
以具有sudo特权的用户身份运行以下命令,以下载并执行NodeSource安装脚本 curl -sL https://deb.nodesource.com/setup_16.x | sudo -E b ...
- HIVE- 各年逐月累加函数
select year_flag,month_flag,field,SUM(field) OVER (PARTITION BY year_flag ORDER BY month_flag)from t ...
- debian 新安装备忘
change resource https://www.cnblogs.com/devzyh/p/12670194.html 安装sougou输入法,并配置好.重启. https://www.cnbl ...
- Spyder无法使用搜狗输入中文的解决办法
Ubuntu 18.04 LTS系统下,spyder4编辑器无法使用搜狗输入中文.系统输入法为fcitx+搜狗拼音,chrome浏览器无此问题.网上答案: Spyder (以及其他PyQt程序) 无法 ...
- db2存储过程 动态拼接sql 、输出数据集示例
*****部分都是表名.因为隐私关系,替换为*了. 1 CREATE PROCEDURE "BI_DM"."SP_GCYP_REPORT" ( 2 startd ...
- kumquat
今天准备做个解释型编程语言,名字就叫kumquat(金桔)因为我刚刚喝了口金桔柠檬茶,挺甜的 用python写把
- mysql中的InnoDB和MyISAM
InnoDB:支持事务,支持表级锁,行级锁,支持外键,是非聚集索引. MyISAM:不支持事务,支持表级锁,不支持外键,聚集索引. 聚集索引和非聚集索引的区别:InnoDB是聚集索引,使用B+Tree ...
- Redis的不同客户端对比
Redis 官方推荐的 Java 客户端有Jedis.lettuce 和 Redisson 客户端 简介 优点 缺点 Jedis 提供了比较全面的 Redis 操作 Jedis 简单全面, 支持 pi ...
- django 关联类 DoesNotExist: User matching query does not exist.
问题就是 关联类为空找不到 在或者geattr / hasattr / obj. item 会抛出异常 无法通过判断处理 捕获异常 try: tmp_data['demand_dept_name'] ...
- ServiceEntry与WorkloadEntry
ServiceEntry: 用于将未能自动添加至网格中的服务,以手形式使得内发 现机制能够访问或路由到这些服务.网格外部的服务 运行于 Kubernetes 上,但却非为 Istio 网格 ...