1. 对象的类型与编码
redis创建一个键值对时,至少创建两个对象,键对象、值对象。
redisObject:
typedef struct redisObject{
//类型
unsigned type:4;
//编码
unsigned encoding:4;
//指向底层数据结构的指针
void *ptr;
//引用计数
int refcount;
//记录最后一次被程序访问的时间
unsigned lru:22;
}robj
1)type属性:记录对象类型
命令:type key
2)encoding 属性和 *prt指针
对象的prt指针指向对象底层的数据结构,而数据结构由encoding属性决定
命令:object encoding key
2. 内存回收和内存共享
redis自己构建了一个内存回收机制,通过redisObject结构的refcount属性实现。
1)创建新对象,refcount初始化1
2)对象被一个新程序使用,refcount+1
3)对象不再被一个程序使用,refcount-1
4)对象应用计数值变为0,对象所占用的内存就会被释放
配置参数maxmemory-policy :设置为0表示不限制。当内存使用达到最大值时,redis使用的清除策略。有以下几种可以选择:
1)volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰;
2)volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰;
3)volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰;
4)allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;
5)allkeys-random:从数据集中任意挑选数据 淘汰;
6)no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误);
通过这种配置,也可以对内存进行回收。
refcount属性实现。
共享对象目前只支持整数值的字符串对象。共享对象虽然会降低内存消耗,但是判断两个对象是否相等需要消费额外的时间。对于整数值判断操作之O(1),普通字符串O(n),哈希、列表、集合、有序集合O(n^2)
1)将数据库键的值指针指向一个现有对象
2)将被共享的值对象引用refcount+1
3. 对象的空转时长
lru属性记录了对象最后一次被命令程序访问的时间
使用object idletime命令可以打印给定键的空转时长,单位S,当前时间-lru
lru属性还可以配合内存回收配置使用:打开maxmemory选项,并且内存回收算法是volatile-lru或allkeys—lru,那么当Redis内存占用超过maxmemory指定的值时,Redis会优先选择空转时间最长的对象进行释放。
4. redis 过期key删除策略
- 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
- 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
- 当前已用内存超过maxmemory限定时,触发主动清理策略
redis对象
原文:https://www.cnblogs.com/wq-blogs/p/11894515.html