作为重要中间层的对象和一些清除数据的方法
type, encoding, ptr 共同实现指向的内容
refcount 引用次数,用于内存管理,减至0就释放掉。
提供对象的内存检测报告等
lru 是用于在内存不足且有限制时(还有其他条件),按一定规则清除某些数据(键值)
根据server.maxmemory_policy 决定使用哪种算法
`freeMemoryIfNeeded()` 需要时释放一些内存,调用`evictionPoolPopulate()`更新EvictionPoolLRU,清除最后的。循环更新清除至够内存。
`evictionPoolPopulate()` 随机几(默认5个)个元素, 选空闲时间比池中元素更大的加进去。运气足够差可能会选到都是很差的结果,但每次随机加几个很难遇到这情况。内存不够就不要要求太多了,又要快。 http://antirez.com/news/109
`activeExpireCycle()` 随机清除一些超过生命时长的键,有处理时限
`expireSlaveKeys()` 可写从库还可以删除其创建的过期键。一般从库都只是等待主库同步删除操作的
- 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()` 可写从库还可以删除其创建的过期键。一般从库都只是等待主库同步删除操作的