深入刨析Redis存储技术设计艺术(一)

一、RedisObject

1.1、Redis数据存储

1.2、RedisObject的数据结构

redis的value都封装在redisObject中

redisObject的底层实现:

redisObject的数据结构如下:

server.h

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
} robj;
  • type:4bit,表示value的类型 obj_string:字符串 0 obj_list:列表 1 obj_set :集合 2 obj_zset : 有序集合 3 obj_hash: 散列 4 obj_module: 模块 5 obj_stream 流 6

  • encoding:4bit,表示value内部存储的编码 10大编码 String: raw(0)、int(1)、embstr(8) hash: ht(2)、zipmap(3)、ziplist(5) list: quicklist(9) zet: intset(6)、ziplist(5) zset: skiplist(7) stream: listpack(10)

  • lru(lfu):24bit,lru表示最后一次访问时间,lfu高16位表示分钟级别的访问时间,低8位表示访问频率

  • refcount:被引用的计数 共享对象:共享值相同的对象

    共享对象一般是整数,不做字符串的

    整数判断相同 判断值 : O(1)

    字符串判断相同 判断内容 O(n)

  • ptr:指向具体数据的指针

1.3、API解析

object.c

createObject

创建对象:

  1. 申请内存

  2. 初始化属性

  3. 如果内存策略是lfu,则赋值lru属性为unix时间取低16位

  4. 否则取unix秒级时间戳

  5. 返回对象指针

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值