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对象的更多相关文章

  1. Redis源代码剖析--对象object

    前面一系列的博客分析了Redis的基本数据结构,有动态字符串sds.双端链表sdlist.字典dict.跳跃表skiplist.整数集合intset和压缩列表ziplist等,这些数据结构对于用户来说 ...

  2. Redis学习之对象系统源码分析

    背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...

  3. Redis 学习笔记(一)redis 数据类型和对象机制

    Redis 简介 Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 value 可以是 String.hash.list.set.zset(有序集 ...

  4. Redis数据结构与对象

    参考<Redis设计与实现> 系列文章目录和关于我 一丶简单动态字符串 当redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,就会使用SDS(simple dynam ...

  5. redis 序列化存入对象

    redis 序列化存入对象 //序列化 public static byte [] serialize(Object obj){ ObjectOutputStream obi=null; ByteAr ...

  6. redis 存储java对象 两种方式

    根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用redi ...

  7. Redis如何存储对象与集合示例详解

      前言 大家都知道在项目中,缓存以及mq消息队列可以说是不可或缺的2个重要技术.前者主要是为了减轻数据库压力,大幅度提升性能.后者主要是为了提高用户的体验度,我理解的是再后端做的一个ajax请求(异 ...

  8. 关于Spring Data redis几种对象序列化的比较

    redis虽然提供了对list set hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的.因此,Spring data提供了若干个Seriali ...

  9. 面试官:Redis的共享对象池了解吗?

    我正在面试间里焦急地等待着,突然听到了门外的脚步声,随即门被打开,穿着干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来. 面试官:"平时在工作中用过Redis吗?" 我:&q ...

  10. redis源码解析(1):redisObject对象说明

    Redis在实现键值对数据库时,并没有直接使用数据结构,而是基于已有的数据结构创建了一个对象系统,每种对象至少包含一种数据结构. redis3.0 中对象结构: typedef struct redi ...

随机推荐

  1. RabbitMQ-01-使用Java进行简单消息发送与接收

    前言 这里使用手动管理jar与使用Maven管理jar两种方式,分别演示消息的发送和接收. 手动管理jar实现消息发送与接收 添加jar amqp-client-5.7.1.jar slf4j-api ...

  2. Linux系统Shell脚本第五章:shell数组、正则表达式及文件三剑客之AWK

    目录 一.shell数组 1.数组分类 2.定义数组方法 二.正则表达式 1.元字符 2.表示次数 3.位置锚定 4.分组 5.扩展正则表达式 三.文本三剑客之AWK 1.awk 2.使用格式 3.处 ...

  3. svn 中的trunk,tags,branches分别是什么意思?

    1.trunk是主分支,是日常开发进行的地方.2.branches是分支.一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中.又比如为不同用户客制化的版本 ...

  4. C++——第三方插件

    EasyX库安装教程 官网:https://easyx.cn/ 下载地址:EasyX Graphics Library for C++ 作品:CodeBus - 分享有趣的 C/C++ 代码 图中标注 ...

  5. JavaScript案例:短信验证码倒计时

    展示效果: 代码示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. 高效XML绑定框架JIBX

    高效XML绑定框架JIBX demo源码地址 https://gitee.com/clover-clover/clover.git 具体路径: clover/clover-frame/clover-f ...

  7. uniapp开发的app打开微信小程序

    第一种 <script> export default { data() { return { sweixin: null } }, onLoad() { this.getPlus() } ...

  8. 实验1task1

      <实验结论> #include <stdio.h> #include <stdlib.h> int main() { printf(" O \n&qu ...

  9. 分布式事务seata

    1.事务的4大基本特征.   1)原子性   2)一致性   3)隔离性   4)持久性 2.什么是分布式事务? 本地事务:单服务进程,单数据库资源,同一个连接conn多个事务操作. 分布式事务:多服 ...

  10. uniapp记录

    1.uniapp获取imei imsi 型号 厂商 https://blog.csdn.net/qq_35620498/article/details/112172115