面试题答案
一键面试常见数据淘汰策略
- 先进先出(FIFO)
- 适用场景:适用于数据具有时效性,且最早进入缓存的数据最不可能再次被访问的场景。例如,新闻资讯类应用的缓存,旧的新闻随着时间推移,被访问的概率逐渐降低。
- 实际后端开发选择理由:如果业务数据有明显的时间先后顺序,且新数据更有价值,FIFO 可以保证缓存空间为新数据腾出位置。在Java开发中,使用
LinkedList
实现一个简单的FIFO缓存结构,当缓存满时,移除链表头部元素(最早进入的元素)。
- 最近最少使用(LRU)
- 适用场景:适用于访问模式符合局部性原理的场景,即最近访问过的数据在未来一段时间内再次被访问的概率较高。如电商应用中用户浏览商品的缓存,用户近期浏览的商品更有可能再次查看。
- 实际后端开发选择理由:LRU 能有效保留热点数据,提升缓存命中率。在Java中可以使用
LinkedHashMap
,通过重写removeEldestEntry
方法实现LRU策略。当缓存达到一定容量时,移除最久未使用的元素。
- 最少使用(LFU)
- 适用场景:适用于数据访问频率相对稳定的场景,即过去访问频率低的数据,未来访问频率也可能较低。比如一些不常用的配置文件缓存,很少被访问的配置文件在后续也不太可能被频繁调用。
- 实际后端开发选择理由:LFU 根据数据的访问次数来淘汰数据,能更准确地反映数据的使用情况。可以通过自定义数据结构,记录每个数据的访问次数,当缓存满时,淘汰访问次数最少的元素。
- 随机淘汰(Random)
- 适用场景:适用于无法预测数据访问模式,且对缓存命中率要求不是特别高的场景。例如一些简单的测试环境,或者缓存数据相对均匀,没有明显热点的数据场景。
- 实际后端开发选择理由:实现简单,在某些情况下能避免因特定淘汰策略带来的复杂计算。在代码中可以通过随机数生成器,随机选择一个缓存中的元素进行淘汰。
- 超时淘汰
- 适用场景:适用于数据有明确有效期的场景,如验证码缓存,验证码在一定时间后就失效。
- 实际后端开发选择理由:通过设置数据的过期时间,能自动清理无效数据,释放缓存空间。在Redis中,可以使用
SET key value EX seconds
命令设置带过期时间的缓存。