MST
星途 面试题库

面试题:Redis缓存减轻MySQL读压力:分布式场景优化

在分布式系统中,使用Redis缓存减轻MySQL读压力,会面临哪些挑战?针对这些挑战,你能提出哪些优化策略?请从数据一致性、缓存雪崩等多个方面进行深入分析并给出具体解决方案。
21.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

数据一致性挑战及优化策略

  1. 挑战:在读写操作频繁的情况下,数据库和缓存之间的数据同步可能出现延迟或不一致,比如先更新数据库,再删除缓存失败,导致读取到旧数据。
  2. 策略
    • 读写锁:在更新数据时,先获取写锁,更新数据库后再更新缓存,确保在写操作期间没有读操作介入,完成后释放锁。
    • 异步更新:使用消息队列,更新数据库后发送消息到队列,由队列消费者负责更新缓存,保证数据一致性的同时提高系统响应速度。
    • 缓存版本号:为缓存数据添加版本号,每次更新数据库时递增版本号,读取缓存时检查版本号,不一致则重新读取数据库并更新缓存。

缓存雪崩挑战及优化策略

  1. 挑战:大量缓存数据在同一时间过期,导致大量请求直接访问数据库,可能使数据库压力过大甚至崩溃。
  2. 策略
    • 设置随机过期时间:在原过期时间基础上,添加一个随机值,使缓存过期时间分散,避免集中过期。
    • 热点数据不过期:对于一些频繁访问的热点数据,不设置过期时间,定期在后台更新缓存数据。
    • 二级缓存:采用主缓存(如Redis)和二级缓存(如本地内存缓存),主缓存失效时先从二级缓存获取数据,减轻数据库压力。

缓存穿透挑战及优化策略

  1. 挑战:查询不存在的数据,每次都穿透缓存直接访问数据库,可能被恶意利用进行攻击,拖垮数据库。
  2. 策略
    • 布隆过滤器:在缓存之前加一层布隆过滤器,判断数据是否存在,不存在则直接返回,避免访问数据库。
    • 空值缓存:查询数据库不存在的数据时,也将空值缓存起来,并设置较短过期时间,后续相同查询直接从缓存获取空值。

缓存击穿挑战及优化策略

  1. 挑战:热点数据缓存过期瞬间,大量请求同时访问,直接打到数据库,可能使数据库负载过高。
  2. 策略
    • 互斥锁:在缓存过期时,使用互斥锁(如Redis的SETNX命令)保证只有一个请求去更新缓存,其他请求等待,更新完成后释放锁。
    • 热点数据永不过期:和缓存雪崩中热点数据处理类似,不过期但定期异步更新。