redis源码学习6 对象和数据

作为重要中间层的对象和一些清除数据的方法
  • object.c 对象
  • evict.c 内存不足时清除一些数据
  • expire.c 超时处理


object.c 对象

redis对象,但一些时候会直接用 sds 而不是这种间接数据
typedef struct redisObject {
    unsigned type:4; /* 类型 */
    unsigned encoding:4; /* 打包格式 */
    unsigned lru:LRU_BITS; /* 缓存管理数据 */
    int refcount; /* 引用次数 */
    void *ptr; /* 内容指针 */
} robj;
设计目的:主要是与客户端(client 结构)交互时使用,提供统一的使用接口
type, encoding, ptr 共同实现指向的内容
refcount 引用次数,用于内存管理,减至0就释放掉。
提供对象的内存检测报告等

lru 是用于在内存不足且有限制时(还有其他条件),按一定规则清除某些数据(键值)
根据server.maxmemory_policy 决定使用哪种算法
  •  LRU time 最近使用时间,创建和 `lookupKey()` 时更新为 `LRU_CLOCK()`
  •  LFU data 最少使用数据,16bits 存衰减时间 + 8bits 存对数计数器


evict.c 内存不足时清除一些数据,默认不开启

struct evictionPoolEntry {
    unsigned long long idle;    /* 对象空闲时间 (或LFU的反序) */
    sds key;                    /* 键名 */
    sds cached;                 /* 此键的 SDS 对象缓存 */
    int dbid;                   /* 键所在db 序号 */
};
EvictionPoolLRU 待清除元素池,动态数组,最多 EVPOOL_SIZE(16) 个,根据idle 升序
`freeMemoryIfNeeded()` 需要时释放一些内存,调用`evictionPoolPopulate()`更新EvictionPoolLRU,清除最后的。循环更新清除至够内存。
`evictionPoolPopulate()` 随机几(默认5个)个元素, 选空闲时间比池中元素更大的加进去。运气足够差可能会选到都是很差的结果,但每次随机加几个很难遇到这情况。内存不够就不要要求太多了,又要快。 http://antirez.com/news/109


expire.c 超时处理,存放在 redisDb.expires

可以用命令设置键的生命时长
`activeExpireCycle()` 随机清除一些超过生命时长的键,有处理时限
`expireSlaveKeys()` 可写从库还可以删除其创建的过期键。一般从库都只是等待主库同步删除操作的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值