说下Redis的缓存淘汰策略

Java面试 潘老师 8个月前 (09-06) 178 ℃ (0) 扫码查看

Java面试题:说下Redis的缓存淘汰策略

标准回答

Redis有两种主要的过期策略:

惰性删除

当客户端访问一个键时,Redis会首先检查其过期时间,如果过期就会立即删除这个键。

定期删除

Redis会将设置了过期时间的键放入一个独立的字典中,并每秒进行10次过期扫描。过期扫描不会遍历字典中的所有键,而是采用一种贪心策略:

  • 从过期字典中随机选择20个键。
  • 删除这20个键中已经过期的键。
  • 如果已过期键的比例超过25%,则重复步骤1。

当写入数据导致超出maxmemory限制时,Redis会根据maxmemory-policy指定的策略进行数据淘汰。该策略有8种选项,其中除了noeviction(不淘汰数据,直接返回错误)之外,筛选键的方式分为volatile(只从设置了过期时间的键中淘汰数据)和allkeys(从所有键中淘汰数据)。对于淘汰方式,有以下后缀选项:

  • ttl(选择过期时间最短的键)
  • random(随机选择键)
  • lru(采用LRU算法淘汰数据)
  • lfu(采用LFU算法淘汰数据)

需要特别关注的是,allkeys是筛选所有键,所以不存在ttl选项。另外,lfu算法是在Redis4版本中引入的。

加分回答

LRU(Least Recently Used)是一种按照最近最少使用原则筛选数据的算法。有两种常见的LRU实现方式:

  • 标准LRU:将所有数据组成一个链表,链表头和链表尾分别表示最常使用端(MRU)和最少使用端(LRU)。最近被访问的数据会被移动到MRU端,而新添加的数据也会成为最近被访问的数据,从而被移到MRU端。当链表的空间满时,会删除LRU端的数据。
  • 近似LRU:Redis会记录每个数据的最近一次访问时间戳(LRU)。当Redis执行写入操作时,如果发现内存超出maxmemory,就会执行一次近似LRU淘汰算法。近似LRU会随机采样N个键,然后淘汰最旧的键。如果淘汰后仍然超出内存限制,则继续采样淘汰。可以通过maxmemory_samples配置项设置每次采样的数据个数,默认为5。

LFU(Least Frequently Used)是Redis4新增的淘汰策略,根据键的最近访问频率来进行淘汰。LFU在LRU的基础上为每个数据增加了一个计数器,用于统计数据的访问次数。在使用LFU策略淘汰数据时,首先会根据数据的访问次数筛选,将访问次数最低的数据淘汰出内存。如果两个数据的访问次数相同,则LFU会比较它们的访问时间,淘汰访问时间更早的数据。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/8835.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】