面试题答案
一键面试缓存失效策略设计
- 设置不同的过期时间:
- 对于热门新闻,由于其时效性长,可以设置相对较长的过期时间,例如数小时甚至一天。这样可以减少热门新闻在缓存中的频繁失效,提高缓存命中率。
- 对于普通新闻,设置较短的过期时间,比如几分钟到半小时不等。因为普通新闻热度消散较快,及时让其缓存失效可以释放内存空间。
- 使用惰性删除和定期删除结合:
- 惰性删除:当客户端访问缓存时,检查键是否过期,如果过期则删除该键并返回空值。这样可以避免在缓存中有大量过期键时,每次写操作都去检查过期键,从而减少对写性能的影响。
- 定期删除:Redis会定期随机抽取一定数量的键进行检查,如果发现过期则删除。通过合理调整定期删除的频率和每次检查的键的数量,可以在不影响太多性能的情况下,有效清理过期键,释放内存。
对性能的影响
- 缓存命中率方面:
- 合理设置不同新闻的过期时间,能让热门新闻长时间保留在缓存中,提高缓存命中率,减少数据库查询次数。对于读操作频繁的新闻网站,这可以显著提高响应速度。
- 然而,如果过期时间设置不合理,例如热门新闻过期时间过短,会导致频繁从数据库中读取数据,降低缓存命中率。
- 内存利用方面:
- 通过设置较短过期时间清理普通新闻缓存,以及定期删除和惰性删除结合清理过期键,能有效控制内存使用,避免内存浪费。
- 但如果定期删除频率过高,会增加CPU负担,影响Redis整体性能;如果频率过低,又可能导致大量过期键长时间占用内存。
优化方法
- 动态调整过期时间:
- 根据新闻的热度变化动态调整过期时间。例如,可以通过监控新闻的点击量、分享量等指标,当发现某条普通新闻热度突然上升,可以适当延长其过期时间;当热门新闻热度下降时,缩短其过期时间。
- 优化定期删除策略:
- 根据服务器的负载情况,动态调整定期删除的频率和每次检查的键的数量。例如,在服务器负载较低时,可以适当增加检查频率和每次检查的键数,更及时地清理过期键;在负载较高时,降低频率和检查数量,避免过度消耗CPU资源。
- 使用缓存淘汰策略:
- 当内存达到一定阈值时,Redis会根据设置的缓存淘汰策略删除部分键。可以选择适合新闻网站业务场景的策略,如
volatile - lru
(在设置了过期时间的键中,删除最近最少使用的键)或allkeys - lru
(在所有键中,删除最近最少使用的键)。这样在内存紧张时,能优先淘汰不常用的新闻缓存,保证缓存的高效运行。
- 当内存达到一定阈值时,Redis会根据设置的缓存淘汰策略删除部分键。可以选择适合新闻网站业务场景的策略,如