程序员分布式

redis中的对象

2018-01-11  本文已影响65人  BlackChen

redis的对象包含5种对象:

redis对象的好处

对象结构

typedef struct redisObject {

    // 类型
    unsigned type:4;

    // 编码
    unsigned encoding:4;

    // 对象最后一次被访问的时间
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */

    // 引用计数
    int refcount;

    // 指向实际值的指针
    void *ptr;

} robj;
编码常量 编码对应底层数据结构
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 跳跃表和字典

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

类型(type) 编码(encoding) 对象
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 使用跳跃表和字典实现有序集合对象

字符串对象

底层实现

raw 和 embstr的区别:

列表对象

底层实现

注意: linekedlist 编码的列表对象再地城的双端链表结构中包含了多个字符串对象,字符串对象是redis五中类型的对象中唯一一种会被其他4中类型对象嵌套的对象

编码转换

当列表对象可以同时满足以下两个条件时,列表对象使用ziplist.

这两个值可以在配置文件中进行修改:

哈希对象

底层实现

-hashTable


编码转换

集合对象

底层实现

编码转换

有序集合对象

底层实现

/*
 * 有序集合
 */
typedef struct zset {

    // 字典,键为成员,值为分值
    // 用于支持 O(1) 复杂度的按成员取分值操作
    dict *dict;

    // 跳跃表,按分值排序成员
    // 用于支持平均复杂度为 O(log N) 的按分值定位成员操作
    // 以及范围操作
    zskiplist *zsl;

} zset;

zset结构中,跳跃表按照分值从小到大保存了所有集合的元素
zset结构中,dict字典为有序结合创建了一个从成员到分值的映射,字典的键保存了元素的成员,字典的值,保存了元素的分值
两种数据结构,通过指针来共享相同的元素成员和分值,不会浪费额外的内存.

注意: 图中为了方便展示,显示了各个元素的成员和分值,实际中,字典和跳跃表会共享元素的成员和分值

编码和转换

对象的内存回收

Redis使用引用计数来实现内存回收机制

对象共享

Redis会在初始化服务器时,创建一万个字符串对象,这些对象包含了从0到9999的所有整数值,服务器使用这些对象时,服务器会共享这些对象,而不是创建新的

对象空转时长

对象的lru属性,记录了对象最后一次被命令访问的时间
服务器打开了Maxmemory选项,并且服务器用于回事欧内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存超过了maxmemory选项所设置的上限值,空转时长较高的那部分键会被优先释放

总结

上一篇下一篇

猜你喜欢

热点阅读