reids对象及对应的底层编码

摘要

1、 Redis数据库中保存的键值对,键总是一个字符串对象,而值可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象;

Redis对象

Redis中对象都是由RedisObject结构表示,该结构中与数据保存有关的三个属性分别是type属性,encoding属性、ptr属性:

typedef struct redisObject{
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4;
    // 指向底层实现数据结构的指针
    void *ptr;
    // ... 其他
} robj;

类型

RedisObject对象的属性"type"记录了对象的类型,也就是常说的Redis支持的5种数据类型;

类型常量                              对象的名称             type命令输出
REDIS_STRING                   字符串对象                       "string"
REDIS_LIST                        列表对象                      "list"
REDIS_HASH                        哈希对象                       "hash"
REDIS_SET                         集合对象                      "set"
REDIS_ZSET                       有序集合对象                  "zset"

编码和底层实现

encoding:对象使用的编码,也就是使用了什么数据结构作为对象的底层实现;

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定;

编码常量                            编码对应的底层数据结构
REDIS_ENCODING_INT                  long类型的整数
REDIS_ENCODING_ EMBSTR              embstr编码的简单动态字符串
REDIS_ENCODING_ RAW                 简单动态字符串
REDIS_ENCODING_HT                           字典
REDIS_ENCODING_ LINKEDLIST                双向链表
REDIS_ENCODING_ZIPLIST                压缩列表
REDIS_ENCODING_INTSET                   整数集合
REDIS_ENCODING_SKIPLIST               跳跃表和字典

类型和编码的对应关系

每种类型的对象至少使用两种不同的编码

类型                               编码                                     对象
REDIS_STRING                REDIS_ENCODING_INT                使用整型值实现的字符串对象
REDIS_STRING                REDIS_ENCODING_ EMBSTR            使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRING                REDIS_ENCODING_ RAW               使用简单动态字符串实现的字符串对象
REDIS_LIST                  REDIS_ENCODING_ZIPLIST            使用压缩列表实现的列表对象
REDIS_LIST                  REDIS_ENCODING_ LINKEDLIST        使用双向链表实现的列表对象
REDIS_HASH                  REDIS_ENCODING_ZIPLIST            使用压缩列表实现的哈希对象
REDIS_HASH                  REDIS_ENCODING_HT                  使用字典实现的哈希对象
REDIS_SET                   REDIS_ENCODING_INTSET              使用整数集合实现的集合对象
REDIS_SET                   REDIS_ENCODING_HT                   使用字典实现的集合对象
REDIS_ZSET                  REDIS_ENCODING_ZIPLIST              使用压缩列表实现的有序集合对象
REDIS_ZSET                  REDIS_ENCODING_SKIPLIST             使用跳跃表和字典实现的有序集合对象

数据类型&编码&底层数据结构 对照图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摘要 1、 Redis数据库中保存的键值对,键总是一个字符串对象,而值可以是字符串对象、列表对象、哈希对象、集合对...
    Muscleape阅读 2,900评论 0 1
  •  Redis 使用对象来表示数据库中的键和值, 每次当我们在 Redis 的数据库中新创建一个键值对时, 我们至少...
    one_zheng阅读 1,189评论 0 0
  • 上周看完Redis设计与实现,过程结合Redis的unstable分支的源码来对照,基本对Redis的实现原理有了...
    zcliu阅读 4,615评论 0 1
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,866评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,277评论 0 4