Redis 缓存过期处理与缓存淘汰机制

引子

计算机内存有限,越大越贵,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……
参考:缓存淘汰算法 LRU 和 LFU
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值