redis的内存回收-过期策略和淘汰策略详解
redis内存回收机制
redis的内存回收主要围绕一下两个方面
- redis过期策略:删除过期时间的key值
- redis淘汰策略:内存使用达到maxmemory上限时会触发内存淘汰数据
redis的过期策略和内存淘汰策略不是一回事
过期策略通常有以下3种
- 定时过期:为每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除,该策略可以立即清除过期的数据,
对内存很友好,但是会占用大量的CPU资源去处理过期时间的数据,从而影响缓存的影响时间和吞吐量 - 惰性过期:只有当访问一个key时,才会判断该key是否过期,如果过期立即清除,该策略可以最大化的节省CPU资源,
但是却对内存非常不友好,极端的情况可能出现大量的key没有被再次访问,从而不会被清除,占用大量的内存 - 定期过期:每隔一定的时间,会扫描一定数量的数据库中的expires字典中的一定数量的key,并清除已经过期的key
该策略是定时过期和惰性过期的折中方案,通过调整定时扫描的时间间隔和每次扫描的限定耗时,就可以在不同情况下
使CPU和内存达到最优的平衡效果
- redis中同时使用了惰性过期和定期过期两种过期策略
redis淘汰策略
- 简介
redis的内存淘汰策略是指当内存使用达到maxmemory极限时,需要使用LRL淘汰算法来决定清理掉哪些数据,
这样才能保证新数据的存入 - LRU算法
redis默认情况下使用的就是LRU策略算法
LRU(least recently used)算法最近最少使用算法, 也就是说默认删除最近最少使用的键
但是一定要注意一点,redis并不会准确删除所有键中最近最少使用的键,而是随机抽取3个,删除这3个中最近最少使用的键
3这个数字也是可以设置采样大小的,如果设置为10,效果会更好,不过会耗费更多的CPU资源,配置文件中可以通过maxmemory-samples设置 - 缓存清理配置
maxmemory用来设置redis存放数据的最大内存大小,一旦超出这个内存大小之后,就会立即调用LRU算法清理掉一部分数据
对于64 bit的机器,如果设置maxmemory=0,那么就等于不限制内存使用,直到机器中的内存耗尽为止,但是在32 bit中,有一个隐式的闲置就是3GB - redis数据淘汰策略
maxmemory-policy 可以设置内存到达最大闲置后,采取什么策略来处理
对应的淘汰策略规则如下:
规则名称 规则说明
volatile_lru 使用lru算法删除一个键(只对设置了生存时间的键)
allkeys_lru 使用lru算法删除一个键
volatile_random 随机删除一个键(只对设置了生存时间的键)
allkeys_random 随机删除一个键
volatile_ttl 删除生存时间最近的一个键
noeviction 不删除键,只返回错误
(1) noeviction: 当内存不足以容纳新写入的数据时,新写入数据会报错
(2) allkeys_lru: 当内存不足以容纳新写入数据时,在键空间中,删除最近最少使用的键
(3) allkeys_random: 当内存不足以容纳新写入数据时,在键空间中,随机删除一个键
(4) volatile_lru: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,删除最近最少使用的键
(5) volatile_random: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机删除一个键
(6) volatile_ttl: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,删除最早过期的键 - 缓存清理的流程
(1)客户端执行数据写入操作
(2)redis server接收到写入操作后,检查maxmemory的限制,如果超过了限制,那么就根据policy清理掉一部分数据
(3)写入操作完成执行
总结
redis淘汰策略就是当内存达到maxmemory最大时又需要申请额外的内存空间,就需要通过淘汰策略淘汰掉一部分数据,给新数据腾出内存空间
redis淘汰策略的选取不会影响过期key的处理
redis过期策略用于处理过期的缓存数据