面试题答案
一键面试不同缓存淘汰策略在高并发读写Web应用场景下对系统性能的影响
- volatile - lru:
- 优点:仅在设置了过期时间的键中,移除最近最少使用的键。适用于部分数据有过期时间且希望优先淘汰不常用过期数据的场景,能有效利用缓存空间,对有过期机制的数据命中率影响较小,在高并发读写时,如果过期数据中有较多不常用的,可提升缓存利用率。
- 缺点:如果大部分数据都设置了过期时间且都是经常使用的,可能会误删有用数据,导致缓存命中率下降,增加数据库负载。同时,在高并发场景下频繁判断过期键中的LRU情况,会有一定CPU开销。
- allkeys - lru:
- 优点:从所有键中移除最近最少使用的键,不区分是否设置过期时间。能全局保证缓存空间的有效利用,在高并发读写场景下,如果数据访问频率符合LRU特性,能很好地保留热点数据,提升缓存命中率,减少数据库查询压力。
- 缺点:若部分数据不应该被淘汰(如配置信息等),可能会被误删。而且在高并发下,对所有键进行LRU计算,相比只对过期键计算,CPU开销更大。
- volatile - ttl:
- 优点:从设置了过期时间的键中,优先淘汰剩余存活时间TTL最短的键。适合对过期时间敏感的场景,在高并发读写时,能保证快过期的数据优先被淘汰,避免缓存数据长时间占用空间。
- 缺点:不考虑数据访问频率,如果即将过期的数据是热点数据,会导致缓存命中率降低,频繁从数据库读取数据,增加数据库负担。而且在高并发场景下,持续判断TTL值也会消耗一定CPU资源。
根据业务需求对Redis缓存淘汰策略进行调优以达最佳性能
- 分析业务数据特性:
- 数据访问频率:如果业务数据访问频率明显符合LRU特性,大部分数据都需要缓存且希望保留热点数据,可选择allkeys - lru。若部分数据有过期时间,且过期数据中有较多不常用的,volatile - lru更为合适。
- 数据过期时间敏感性:对于对过期时间非常敏感,希望快过期的数据优先被淘汰的业务场景,如限时活动数据等,volatile - ttl策略是较好选择。
- 监控与调整:
- 监控指标:通过Redis的INFO命令监控缓存命中率、键空间大小、逐出键的数量等指标。高并发场景下,缓存命中率降低、逐出键数量过多可能意味着淘汰策略不合理。
- 动态调整:根据监控数据动态调整淘汰策略。例如,业务高峰期时,数据访问频率变化,若发现缓存命中率下降,可尝试切换到更适合当前访问模式的淘汰策略。
- 结合其他优化手段:
- 数据分层缓存:将热点数据和非热点数据分层缓存,对于绝对不能淘汰的核心配置数据等,可采用其他存储方式(如本地内存缓存)或设置为永不过期(但要注意内存占用)。
- 优化数据结构:合理设计Redis的数据结构,减少内存占用,如使用Hash结构存储对象,避免每个属性都作为单独键存储,从而降低缓存淘汰压力。