redis缓存更新分为:内存溢出淘汰策略、过期删除策略、应用方更新
一、内存溢出淘汰策略
- 当redis所用内存达到maxmemory时(use_memory>maxmemory),会触发相应的溢出控制策略,具体策略可配
根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
maxmemory-policy volatile-lru
根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
maxmemory-policy allkeys-lru
随机删除过期键,直到腾出足够空间为止。
maxmemory-policy volatile-random
随机删除所有键,直到腾出足够空间为止。
maxmemory-policy allkeys-random
根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略
maxmemory-policy volatile-ttl
默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOM command not allowed when used memory,此时Redis只响应读操作。
maxmemory-policy noeviction
可用以下命令动态配置
config set maxmemory-policy {policy}
写命令导致当内存溢出时,会频繁执行,回收内存成本很高,如果redis有从节点,回收内存操作对应的删除命令会同步到从节点,导致写放大的问题。
二、过期删除策略
-
惰性删除
redis的每个库都有一个过期字典,过期字典中保存所有key的过期时间。当客户端读取一个key时会先到过期字典内查询key是否已经过期,如果已经过期,会执行删除操作并返回空。
这种策略是出于节省CPU成本考虑,但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。
- 定时删除
redis内部维护一个定时任务,默认每秒运行10次。通过hz修改运行次数。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例、使用快慢两种速率模式回收键。ServerCron,慢模式:定时任务执行时间超过25毫秒自动退出。快模式:上次执行时间超过25毫秒,则采用快模式,快模式下超时时间为1毫秒且2秒内只能运行1次。
三、应用方更新
- 应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中
- 先删除缓存,再更新数据库(不推荐,并发下会出现读老数据的情况)
- 先更新数据库,再删除缓存(推荐)