请简要描述下你在项目中使用的缓存策略。

本题考察大家是否在项目中真真切切的用过缓存,是否有过设定一些缓存的策略, 以下是我在项目中常用的缓存策略,大家在回答时要深刻的挖掘自己的项目是否匹配。

1. 缓存穿透防范

  • 空值缓存:对于查询结果为空的情况(例如查询某个不存在的记录),我会缓存空值,避免每次都访问数据库。通常通过设置短的缓存过期时间来避免缓存过期数据长时间占用缓存。
  • 布隆过滤器:在请求到达缓存层之前,使用布隆过滤器判断查询的数据是否存在,避免无效请求查询数据库。

2. 缓存雪崩防范

  • 缓存过期时间随机化:为每个缓存项设置不同的过期时间,避免缓存同时失效,造成大规模请求集中涌向数据库。
  • 预加载缓存:对于一些热数据,我会在缓存快到期时提前加载新的数据,避免缓存空缺时的大量数据库访问。
  • 加锁机制:使用分布式锁(如 Redis 的 SETNX)来保证只有一个请求会去更新缓存,避免缓存同时失效时数据库承受过大压力。

3. 缓存击穿防范

  • 分布式锁:当缓存失效时,采用分布式锁(例如使用 Redis 或 Zookeeper)来确保只有一个请求会去访问数据库并更新缓存,其他请求可以等待缓存更新,避免并发查询数据库。
  • 双重检查:在数据库查询之前进行缓存检查,如果发现缓存已失效,第二次检查缓存是否正在更新。如果是,则等待;如果不是,则从数据库查询并更新缓存。

4. 热点数据处理

  • 长时间缓存:对于热点数据,设置较长时间的缓存,避免频繁失效带来的数据库压力。
  • 永不过期缓存:一些不经常更新但又高频访问的数据可以设置为永不过期,确保缓存数据的持续可用。

5. 缓存更新策略

  • 主动更新:在数据变更时,主动更新缓存。可以通过事件通知、数据库触发器等方式,确保缓存中的数据始终保持一致。
  • 定期清理:定期清理过期缓存或使用 LRU(Least Recently Used)策略淘汰最久未使用的缓存。

6. 分布式缓存架构

  • Redis 集群和分片:采用 Redis Cluster 或 Redis Sentinel 来实现缓存的分布式部署,确保缓存的高可用性和扩展性。
  • 数据一致性:通过合理设计数据存储和缓存策略,确保数据库和缓存之间的数据一致性,避免缓存与数据库不同步的问题。

本题小结:这是一道常规题,大家在大脑中有一些基本的缓存策略,如何解决缓存穿透,击穿,雪崩,保证高可用性使用Redis集群,哨兵机制确保集群稳定执行。

发表评论

后才能评论