手记

redis笔记:对象

对象的类型

redis中的对象包括:

  • 字符串对象 REDIS_STRING

  • 列表对象 REDIS_LIST

  • 哈希对象 REDIS_HASH

  • 集合对象 REDIS_SET

  • 有序集合对象 REDIS_ZSET

对象的底层编码实现

  • 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_STRINGREDIS_ENCODING_INT整数值实现的字符串
REDIS_STRINGREDIS_ENCODING_EMBSTRembstr编码的字符串
REDIS_STRINGREDIS_ENCODING_RAW简单动态字符串的字符串
REDIS_LISTREDIS_ENCODING_ZIPLIST压缩列表实现的列表
REDIS_LISTREDIS_ENCODING_LINKEDLIST双端列表实现的列表
REDIS_HASHREDIS_ENCODING_HT字典实现的哈希对象
REDIS_HASHREDIS_ENCODING_ZIPLIST压缩列表实现的哈希对象
REDIS_SETREDIS_ENCODING_INTSET整数集合实现的集合
REDIS_SETREDIS_ENCODING_HT字典实现的集合
REDIS_ZSETREDIS_ENCODING_SKIPLIST跳跃表实现的有序集合
REDIS_ZSETREDIS_ENCODING_ZIPLIST压缩列表实现的有序集合

字符串对象

  • 是整数、并可以用long表示,编码为 REDIS_ENCODING_INT

  • 是一个字符串值,长度大于32字节,REDIS_ENCODING_RAW

  • 是一个字符串值,长度小于等于32, REDIS_ENCODING_EMBSTR(减少内存的申请,释放操作)

要点:

  1. EMBSTR通过一次申请连续的内存空间存储redisObject,sdshdr

  2. 释放也只需要一次

  3. long double采用字符串存储

  4. EMBSTR修改直接转换成raw,EMBSTR可以理解为只读

列表对象

使用压缩列表默认条件(可修改):

  1. 所保存的字符串元素长度都小于64字节

  2. 元素数量小于512个

  3. 不满足上述条件的采用双端链表实现列表对象

  4. 使用过程中不满足1.2条时,会转化底层的实现为双端

哈希对象

使用压缩列表时:

  • 先将保存键的节点放在压缩列表的队尾,然后是保存了值的节点

  • 所以同一键值对的节点是在一起的,键在前,值在后

  • 先添加的在压缩列表的头部,后来的在尾部

使用字典实现哈希:

  • 哈希对象的每个键值使用一个字典的键值表示

使用压缩列表的默认条件(可修改):

  • 所有的键值对的键、值都小于64字节

  • 键值对数量小于512

集合对象

可以采用整数结合、字典实现。
采用字典实现时,字典每个键都是一个集合元素,字典的值设置为null
使用整数集合的默认条件(可以修改):

  • 所有元素都是整数

  • 元素数量不超多512

有序集合

可以使用压缩列表、跳跃表和字典实现。

  • 使用压缩列表:每个元素采用两个紧挨一起的节点表示,前一个表示成员,后一个表示分数。压缩列表内部按照分数大小前后排序。

  • 使用跳跃表和字典:同时包含一个跳跃表和字典。跳跃表按照分数大小保存了所有的集合元素(包括成员、分数),字典实现了成员到分值的映射,字典的键为元素成员,值为元素的分数,能够很快找到成员的分数

    • 通过跳跃表实现范围类型的操作。

    • 字典实现快速查找分数

    • 字典和跳跃表通过指针共享相同的元素的成员和分数,不会冗余

使用压缩列表的默认条件(可以修改):

  • 元素数量小于128

  • 元素的成员的长度都小于64字节

引用计数

  • redisObject结构中的refcount属性记录了对象的引用计数

  • object refcount key 查看引用计数

对象共享

  • 默认初始化服务的时候新建0-9999的整数字符串进行共享

  • 只共享整数因为对比消耗cpu少

对象空转时间

  • redisObject结构中的lru记录最后一次使用时间

  • object idletime key 查看空转时间

  • idletime不会更新lru



作者:峰巢
链接:https://www.jianshu.com/p/df97b0ffcb98


0人推荐
随时随地看视频
慕课网APP