Redis 对象及其编码

查看某个对象使用的编码,可以使用命令:

redis> OBJECT ENCODING key

1、字符串对象(String)

1、编码方式

  • int:保存的是整数值,并且可以用long类型表示;
  • raw:保存字符串(包括浮点数),并且长度大于39字节;
  • embstr:只读,修改会变更为row,保存字符串(包括浮点数),并且长度小于等于39字节;

2、编码转换

  • int => raw:执行命令后,对象保存的值变更为字符串值时,自动转换;
  • embstr => raw:对象执行修改之后就会转换;

3、结构图

  • int


    image
  • raw


    image
  • embstr


    image

2、列表对象(List)

1、编码方式

  • ziplist:压缩列表,支持从两端添加,使用整块内存存储,每个节点保存一个列表元素;
  • linkedlist:双端链表,链表结构,每个节点保存一个字符串对象,每个字符串对象都保存一个列表元素;

2、编码转换

同时满足以下两种条件,使用ziplist编码,其他使用linkedlist
下面条件中的上限值可以修改配置文件

  • 保存的所有字符串元素的长度都小于64字节;
  • 列表保存的元素数量小于512个;

3、结构图

  • ziplist


    image-20201202192000619
  • linkedlist


    image-20201202192045190

3、哈希对象(Hash)

1、编码方式

  • ziplist:压缩列表,从表尾添加,先保存键的节点,再保存值得列表节点;
  • hashtable:字典,每个键、值都是字符串对象,字符串对象中保存了相应的键和值;

2、编码转换

同时满足以下两种条件,使用ziplist编码,其他使用hashtable
下面条件中的上限值可以修改配置文件

  • 所有键值对的键和值得字符串长度都小于64字节;
  • 键值对的数量小于512个;

3、结构图

  • ziplist


    image-20201202192223367
image-20201202192246991
  • hashtable


    image-20201202192306534

4、集合对象(Set)

1、编码方式

  • intset:整数集合,所有元素都保存在整数集合里面;
  • hashtable:字典,每个键都是字符串对象,其中包集合元素,字典的值都为null;

2、编码转换

集合对象同时满足以下两个条件,使用intset编码,其他使用hashtable编码
下面条件中的上限值可以修改配置文件

  • 所有元素都是整数值;
  • 元素数量不超过512;

3、结构图

  • insetset


    image-20201202193415688
  • hashtable


    image

5、有序集合对象(Zset)

1、编码方式

  • ziplist:压缩列表,每个元素两个节点,分别为元素和对应的分支,元素按分值从小到大排序;
  • skiplist:跳表+字典,跳表保证顺序操作,字典保证取数据O(1);

2、编码转换

集合对象同时满足以下两个条件,使用ziplist编码,其他使用skiplist编码
下面条件中的上限值可以修改配置文件

  • 元素数少于128个;
  • 所有元素的长度都小于64字节;

3、结构图

  • ziplist


    image-20201203132840913

    image-20201203132900146
  • skiplist


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

推荐阅读更多精彩内容