Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回
收。内存回收主要分为两类,一类是 key 过期,一类是内存使用达到上限(max_memory)
触发内存淘汰。
一、Key过期回收策略(过期策略)
Key值过期回收策略有以下三种方案:
1、定时回收:针对每个key值新增一个定时器,定时监听key值的过期时间。
优点:及时 缺点:CPU开销大
2、惰性回收:key值在过期以后,不主动淘汰,只有被使用时,才去判断key是否过期,过期则回收。
优点: CPU开销较少 缺点:内存浪费严重
3、定期回收:针对所有key值,定时扫描,清理过期key。
优点:前两种的折中,可以配置,最优策略
对于redis,则只采用惰性回收策略和定期回收两种策略。
二、内存使用达到上限回收策略(淘汰策略)
LRU,Least Recently Used:最近最少使用的Key。判断最近被使用的时间,目前最远的数据优先被淘汰。
LFU,Least Frequently Used:最不常用的Key,优先被清理。
附录:
redis设置策略
含义
volatile-lru:
根据 LRU
算法删除设置了超时属性(expire)的键,直到腾出足够内存为止。如果没有 可删除的键对象,回退到 noeviction
策略。
allkeys-lru :
根据 LRU
算法删除键,不管数据有没有设置超时属性,直到腾出足够内存为止。
volatile-lfu:
在带有过期时间的键中选择最不常用的。
allkeys-lfu :
在所有的键中选择最不常用的,不管数据有没有设置超时属性。
volatile-random :
在带有过期时间的键中随机选择。
allkeys-random :
随机删除所有键,直到腾出足够内存为止。
volatile-ttl:
根据键值对象的 ttl
属性,删除最近将要过期数据。如果没有,回退到
noeviction
策略。
noeviction :
默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)
OOM command not allowed when used memory,此时
Redis
只响应读操作