Redis的对象结构:
typedef struct redisObject {
unsigned type:4; //类型
unsigned encoding:4; //编码
int refcount; //引用计数
unsigned lru:22; //淘汰策略,最近最少使用
void *ptr; //指向底层实现的数据结构
} robj;
Redis 用引用计数技术实现内存的回收机制
1、创建新对象,并指向key时,计数器会初始化为1。
2、被其它对象引用时,计数器+1。
3、对象不被其它对象引用时,计数器-1。
4、当对象计数器为0时,对象所占用的内存将会被释放。
Redis的淘汰策略:当内存不足时,Redis会根据LRU(最近最少使用)腾出内存。
高版本的Redis中当内存达到极限时,内存淘汰策略主要采用了6种方式进行内存对象的释放操作
1.volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放
2.allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放
3.volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放
4.allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放
5.volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作
6.noeviction:不删除任意数据(但redis还会根据引用计数器进行释放呦~),这时如果内存不够时,会直接返回错误
默认的内存策略是noeviction,在Redis中LRU算法是一个近似算法,默认情况下,Redis随机挑选5个键,并且从中选取一个最近最久未使用的key进行淘汰,在配置文件中可以通过maxmemory-samples的值来设置redis需要检查key的个数,但是栓查的越多,耗费的时间也就越久,但是结构越精确(也就是Redis从内存中淘汰的对象未使用的时间也就越久~)