redis之内存淘汰策略和过期删除策略
前言
redis是基于内存的,如果内存超过限定值(redis配置文件的maxmemory参数决定redis最大内存使用量),导致新的数据存不进去,此时redis会根据淘汰策略删除一些数据
一 内存淘汰策略
淘汰策略由redis配置文件的maxmemory-policy参数决定设置,默认为no-eviction模式
淘汰策略的执行过程
1) 执行写请求时,redis会检查内存使用情况,内存使用超过限定值,按照淘汰策略删除key
2) redis写入新数据
1 noeviction
当写入新数据后的内存超过限定值时,写请求直接返回错误,只读请求可以正常执行,默认策略
2 allkeys-lru
当写入新数据后的内存超过限定值时,从所有key中使用LRU算法(最近最少使用算法)淘汰最久没有使用过的key
3 volatile-lru
当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LRU算法淘汰最久没有使用过的key
4 allkeys-random
当写入新数据后的内存超过限定值时,从所有key中随机淘汰key
5 volatile-random
当写入新数据后的内存超过限定值时,从设置了过期时间的key中随机淘汰key
6 volatile-ttl
当写入新数据后的内存超过限定值时,从设置了过期时间的key中根据过期时间淘汰key,越快过期越早淘汰
7 allkeys-lfu
当写入新数据后的内存超过限定值时,从所有key中使用LFU算法(最少频率访问算法)淘汰使用频率最低的key
8 volatile-lfu
当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LFU算法淘汰使用频率最低的key
二 过期删除策略
前面的八种淘汰策略都是在内存超过限定值才会使用,当内存没有达到限定值,redis也会使用策略删除过期的key
1 定时删除
key设置了过期时间,一旦过期立即删除
优点
key一旦过期就会立即删除,不会占用内存
缺点
过期key较多时,删除key会占用CPU时间,影响服务器的响应时间,吞吐量,性能
2 惰性删除
过期key不会马上被删除,而是继续保存在内存中,当key被访问时检查key的过期时间,若已过期则删除
优点
只在访问时才会对检查key的过期时间,没使用的key不会占用CPU的时间去检查过期时间,不会影响服务器的响应时间,吞吐量,性能
缺点
没有被访问的过期key继续保存在内存中,导致内存不会被释放,消耗内存资源
3 定期删除
每隔一段时间(时间可以自行设置,redis配置文件的hz参数表示1s执行多少次定期删除策略,默认值10),随机抽取设置了过期时间的key检查它们的过期时间,删除已过期的key
优点
可以指定频率来减少删除操作对CPU性能的影响
定期删除也能释放没有被访问的过期key占用的内存
缺点
频率高影响CPU的性能
频率低过期key占用的内存不会及时释放