redis 对象

    对象

  •     redis有5种对象:字符串对象、列表对象、集合对象、哈希对象、有序集合对象。
  •     redis中有6中主要数据结构:简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表。
  •     redis对象主要包含以下属性:
/*
 * Redis 对象
 */
typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 对齐位
    unsigned notused:2;
    // 编码方式
    unsigned encoding:4;
    // LRU 时间(相对于 server.lruclock)
    unsigned lru:22;
    // 引用计数
    int refcount;
    // 指向对象的值
    void *ptr;
} robj;
    
  •     对象编码表示对象使用的数据结构:
/*
 * 对象编码
 */
#define REDIS_ENCODING_RAW             // 编码为字符串
#define REDIS_ENCODING_EMBSTR          // 编码为embstr编码的SDS
#define REDIS_ENCODING_INT             // 编码为整数
#define REDIS_ENCODING_HT              // 编码为哈希表
#define REDIS_ENCODING_ZIPMAP          // 编码为 zipmap
#define REDIS_ENCODING_LINKEDLIST      // 编码为双端链表
#define REDIS_ENCODING_ZIPLIST         // 编码为压缩列表
#define REDIS_ENCODING_INTSET          // 编码为整数集合
#define REDIS_ENCODING_SKIPLIST        // 编码为跳跃表
 
 

  • 对象可以以多种方式编码:

  • 字符串可以被编码为 raw、embstr、int (用字符串表示64位数字是为了节约空间)。
   大于32字节的字符用raw,小于等于用embstr,数字用int
  • 列表可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。

列表所有元素小于64字节且数量小于512时使用ziplist,否则用linkedlist。该上限值可以通过参数修改

  • 集合可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。

集合所有元素是整数值且数量小于512时使用intset,否则用hashtable。该上限值可以通过参数修改

  • 哈希表可以编码为 ziplist 或者 hashtable 。 ziplist 是小哈希表的特殊表示。

哈希表所有元素小于64字节且数量小于512时使用ziplist,否则用hashtable。该上限值可以通过参数修改

  • 有序集合可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。

有序集合所有元素小于64字节且数量小于128时使用ziplist,否则用skiplist。该上限值可以通过参数修改

对象内存回收

    对象采用引用计数计数实现内存回收。
  • 每个 redisObject 结构都带有一个 refcount 属性,指示这个对象被引用了多少次。
  • 当新创建一个对象时,它的 refcount 属性被设置为 1
  • 当对一个对象进行共享时,Redis 将这个对象的 refcount 增一。
  • 当使用完一个对象之后,或者取消对共享对象的引用之后,程序将对象的 refcount 减一。
  • 当对象的 refcount 降至 0 时,这个 redisObject 结构,以及它所引用的数据结构的内存,都会被释放

   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值