MST

星途 面试题库

面试题:Redis与MySQL结合时的数据一致性保障

当使用Redis与MySQL结合进行数据查询时,数据一致性是一个关键问题。例如在一个社交平台中,用户发布动态后,MySQL存储动态的详细信息,Redis用于缓存热门动态以加速展示。请详细描述如何在高并发情况下保障Redis与MySQL数据的一致性,针对读写操作分别说明可能采取的技术手段及面临的挑战。
46.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

写操作

  1. 先写MySQL,再删Redis
    • 技术手段:应用程序先将数据写入MySQL,写入成功后删除对应的Redis缓存。这样当下次读取时,由于缓存已被删除,会从MySQL读取最新数据并重新写入Redis缓存。
    • 面临挑战:高并发场景下,写MySQL成功但删Redis失败时,会导致数据不一致。例如在高并发写入时,若删Redis操作出现网络延迟或异常,缓存中还是旧数据。同时,在删除Redis和下次读取并重建缓存的间隙,也可能读到旧数据。
  2. 先删Redis,再写MySQL
    • 技术手段:应用程序先删除Redis中的缓存数据,再将数据写入MySQL。后续读取时,由于缓存已被删除,会从MySQL读取新数据并更新到Redis。
    • 面临挑战:如果在删除Redis缓存后,写MySQL操作失败,而此时其他请求读取数据,会重新从MySQL加载旧数据到Redis,导致数据不一致。而且在高并发环境下,可能存在缓存击穿问题,即大量请求在缓存删除后同时访问MySQL,给MySQL带来巨大压力。

读操作

  1. 缓存预热
    • 技术手段:在系统启动时,预先将热门数据从MySQL加载到Redis中,这样初始阶段用户请求就能直接从Redis获取数据,减少对MySQL的压力,同时也保障了数据一致性(因为加载的数据是最新的)。
    • 面临挑战:需要准确判断哪些数据是热门数据,否则可能预热了大量不常用数据,浪费Redis空间。而且如果数据更新频繁,缓存预热的数据可能很快就过时,需要频繁重新预热。
  2. 缓存穿透处理
    • 技术手段:使用布隆过滤器(Bloom Filter)等技术,在查询数据前先判断数据是否存在。如果布隆过滤器判断数据不存在,直接返回,避免查询MySQL。如果判断存在,再去查询Redis和MySQL。这样可以防止大量查询不存在数据的请求穿透到MySQL,影响数据一致性(因为如果MySQL压力过大导致数据写入延迟等问题,可能会影响Redis缓存更新)。
    • 面临挑战:布隆过滤器存在误判率,可能会把原本存在的数据误判为不存在,导致部分请求无法正确获取数据。同时,布隆过滤器需要占用一定内存空间,且随着数据量增长,维护成本也会增加。
  3. 双缓存策略
    • 技术手段:设置两个缓存,如主缓存和副缓存。主缓存存储常用数据,副缓存存储备份数据或近期可能会被访问的数据。读取时先读主缓存,若未命中再读副缓存,若副缓存也未命中则查询MySQL并更新两个缓存。这样即使主缓存数据出现不一致情况,副缓存也能提供相对准确的数据,同时减少对MySQL的查询次数。
    • 面临挑战:增加了缓存管理的复杂度,需要合理设置主副缓存的过期时间、更新策略等。而且占用更多的Redis空间,成本增加。