Redis 缓存过期处理与缓存淘汰机制
2020-08-28 本文已影响0人
snoopy_fly_
引子
计算机内存有限,越大越贵,redis 的高并发高性能都是基于内存的,用硬盘的话 GG
已过期的 key 如果处理?
设置了 expire 的 key 缓存过期了,但是服务器的内存还是会占用,这是因为 redis 所基于的两种删除策略
- (主动)定时删除:定时随机的检查过期的 key,如果过期则清理删除(每秒检查次数在 redis.conf 中的 hz 配置)
- (被动)惰性删除:当客户端请求一个已经过期的 key 的时候,那么 redis 会检查这个 key 是否过期,如果过期则删除,返回一个 nil,这种策略对 CPU 比较友好,不会有太多的损耗,但是内存占用会比较高
所以,即使 key 过期了,但是只要没有被 redis 所清理,那么内存还是占用着的。
如果内存被 redis 占用满了怎么办?
内存如果占满了,可以使用硬盘,但是没有意义,因为硬盘没有内存块,会严重影响 redis 的性能,所以,当内存占用满了之后,redis 提供了一套缓存淘汰机制,即 memory management
# 当内存已使用值达到 maxmemory,开始清理缓存
# 单位:bytes(字节),123000000Byte ≈ 117.3M
maxmemory 123000000
# maxmemory-policy 缓存淘汰策略值枚举:
volatile-lru:在使用 expire 设置了过期时间的 key 中,删除最近最少使用的缓存,然后保存新的缓存
allkeys-lru:删除最近最少使用的缓存,然后保存新的缓存(推荐使用)
volatile-lfu:在使用 expire 设置了过期时间的 key 中,删除最不经常使用的缓存,然后保存新的缓存
allkeys-lfu:删除最不经常使用的缓存,然后保存新的缓存(推荐使用)
volatile-random:在使用 expire 设置了过期时间的 key 中,随机删除一个 key
allkeys-random:在所有 key 中,随机删除一个 key
volatile-ttl:在使用 expire 设置了过期时间的 key 中,删除最快要过期的 key,即删除 TTL 最小的 key
noeviction:不删除任何数据,报出写操作异常(默认值)
LRU 和 LFU 的区别
- LRU:Least Recently Used,即最近最少使用页面置换算法,淘汰访问时间最早的数据
- LFU:Lease Frequently Used,即最不经常使用页面置换算法,将数据按照访问频次排序,淘汰访问频次最低的数据
- 对比:
- LRU 对于循环出现的数据,缓存命中率不高,如:1,1,1,2,2,2,3,4,1,1,1,2,2,2……
- LFU 对于交替出现的数据,缓存命中率不高,如:1,1,1,2,2,3,4,3,4,3,4,3,4,3,4,3,4……