千家信息网

redis的Object结构体怎么定义

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"redis的Object结构体怎么定义"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"redis的Object结构体怎么定义"文章能帮助大家解
千家信息网最后更新 2026年10月31日redis的Object结构体怎么定义

这篇文章主要介绍"redis的Object结构体怎么定义"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"redis的Object结构体怎么定义"文章能帮助大家解决问题。

Redis的两层数据结构简介

redis的性能高的原因之一是它每种数据结构都是经过专门设计的,并都有一种或多种数据结构来支持,依赖这些灵活的数据结构,来提升读取和写入的性能。如果要了解redis的数据结构,可以从两个不同的层面来讨论它:

  • 第一个层面,是从使用者的角度,这一层面也是Redis暴露给外部的调用接口,比如:string,list,hash,set,sorted set。

  • 第二个层面,是从内部实现的角度,属于更底层的实现,比如:dict,sds,ziplist,quicklist,skiplist,intset。

Redis数据结构的内部实现

从Redis的使用者的角度来看,一个Redis节点包含多个database(非cluster模式下默认是16个,cluster模式下只能是1个),而一个database维护了从key space到object space的映射关系。这个映射关系的key是string类型,而value可以是多种数据类型,比如:string, list, hash、set、sorted set等。我们可以看到,key的类型固定是string,而value可能的类型是多个。

而从Redis内部实现的角度来看,database内的这个映射关系是用一个dict来维护的。dict的key固定用一种数据结构来表达就够了,这就是动态字符串sds。而value则比较复杂,为了在同一个dict内能够存储不同类型的value,这就需要一个通用的数据结构,这个通用的数据结构就是robj,全名是redisObject。

举个例子:

  • 如果value是一个list,那么它的内部存储结构是一个quicklist。

  • 如果value是一个string,那么它的内部存储结构一般情况下是一个sds。但如果string类型的value的值是一个数字,那么Redis内部还会把它转成long型来存储,从而减小内存使用。

所以,一个robj既能表示一个sds,也能表示一个quicklist,甚至还能表示一个long型。

redisObject结构体

redisObject的定义如下:

typedef struct redisObject {    unsigned type:4;    unsigned encoding:4;    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */    int refcount;    void *ptr;} robj;

一个robj包含如下5个字段:

  • type: 对象的数据类型。占4个bit。可能的取值有5种: OBJ_STRING, OBJ_LIST, OBJ_SET, OBJ_ZSET,
    OBJ_HASH,分别对应Redis对外暴露的5种数据结构

  • encoding: 对象的内部表示方式(也可以称为编码),占4个bit,可能的取值有10种。

  • lru: 做LRU替换算法用,占24个bit。

  • refcount: 引用计数。它允许robj对象在某些情况下被共享。

  • ptr: 数据指针。指向真正的数据。比如,一个代表string的robj,它的ptr可能指向一个sds结构;一个代表list的robj,它的ptr可能指向一个quicklist。

这里特别需要仔细察看的是encoding字段。对于同一个type,还可能对应不同的encoding,这说明同样的一个数据类型,可能存在不同的内部表示方式。而不同的内部表示,在内存占用和查找性能上会有所不同。

当type = OBJ_STRING的时候,表示这个robj存储的是一个string,这时encoding可以是下面3种中的一种:

  • OBJ_ENCODING_RAW: string采用原生的表示方式,即用sds来表示。

  • OBJ_ENCODING_INT: string采用数字的表示方式,实际上是一个long型。

  • OBJ_ENCODING_EMBSTR: string采用一种特殊的嵌入式的sds来表示。

当type = OBJ_HASH的时候,表示这个robj存储的是一个hash,这时encoding可以是下面2种中的一种:

  • OBJ_ENCODING_HT: hash采用一个dict来表示。

  • OBJ_ENCODING_ZIPLIST: hash采用一个ziplist来表示。

encoding的十种取值如下:

  • OBJ_ENCODING_RAW: 最原生的表示方式。其实只有string类型才会用这个encoding值(表示成sds)。

  • OBJ_ENCODING_INT: 表示成数字。实际用long表示。

  • OBJ_ENCODING_HT: 表示成dict。

  • OBJ_ENCODING_ZIPMAP: 是个旧的表示方式,已不再用。在小于Redis 2.6的版本中才有。

  • OBJ_ENCODING_LINKEDLIST: 也是个旧的表示方式,已不再用。

  • OBJ_ENCODING_ZIPLIST:表示成ziplist。

  • OBJ_ENCODING_INTSET: 表示成intset。用于set数据结构。

  • OBJ_ENCODING_SKIPLIST: 表示成skiplist。用于sorted set数据结构。

  • OBJ_ENCODING_EMBSTR: 表示成一种特殊的嵌入式的sds。

  • OBJ_ENCODING_QUICKLIST: 表示成quicklist。用于list数据结构。

redisObject的作用

redisObject的作用的作用如下:

  • redisObjec是联结两个层面的数据结构的桥梁。

  • 为多种数据类型提供一种统一的表示方式。

  • 允许同一类型的数据采用不同的内部表示,从而在某些情况下尽量节省内存。

  • 支持对象共享和引用计数。当对象被共享的时候,只占用一份内存拷贝,进一步节省内存。

关于"redis的Object结构体怎么定义"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

结构 数据 数据结构 类型 不同 方式 存储 内存 对象 层面 角度 作用 多种 实际 性能 情况 指向 数字 时候 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 互联网科技有限公司经营范围 万易互联网科技 深圳互联网络科技有限公司 狮子座互联网科技 互联网科技作文 苏州互联网科技贷款公司 互联网金融科技平台 猫创互联网科技 上海卓越科技 互联网 上海电发互联网科技有限公司 智腾互联网科技有限公司 和信科技工业互联网 速维有品互联网信息科技(苏州)有限公司 深圳市优智互联网科技有限公司 互联网科技人工智能实验室 山东星卡互联网科技有限公司官网 上海钢联属于互联网科技股吗 深圳无忧互联网科技 2021世界互联网领先科技成果发布 互联网最新的科技有限公司 中资互联网科技 奇酷互联网科技公司 互联网科技论文 互联网金融科技创新 湖南洣水互联网科技有限公司扣款 深圳市运趣互联网科技有限公司 栖莱科技互联网股份有限公司 移动互联网科技公司 中国新注册互联网科技
0