Redis面试题, 如何保证缓存与数据库的数据一致性?
Redis面试题, 如何保证缓存与数据库的数据一致性?
QA
Step 1
Q:: Redis面试题:如何保证缓存与数据库的数据一致性?
A:: 为了保证缓存与数据库的一致性,通常采用以下策略:
1.
缓存穿透:如果查询的数据在缓存中不存在(即缓存命中失败),就去查询数据库,将结果写入缓存。通过设置合理的缓存失效时间来确保缓存数据及时更新。
2.
缓存雪崩:为了防止缓存同时过期引发的雪崩效应,可以采用不同的失效时间或加锁机制确保缓存的逐渐过期,而不是在同一时间过期。
3.
缓存更新策略:可以使用两种主要的策略来保持缓存与数据库的一致性:
-
先更新数据库,再删除缓存:当数据库数据更新时,立即删除缓存中的旧数据。这样可以确保缓存不会存有脏数据。
-
先删除缓存,再更新数据库:删除缓存后,再更新数据库。当数据库更新后,下一次查询会触发缓存重新加载,确保缓存中的数据是最新的。
4.
双写一致性:当一个写操作涉及到数据库和缓存时,通常的做法是:
-
先更新数据库,再更新缓存。
-
或者,使用消息队列,将写入操作异步推送到缓存,确保最终一致性。
5.
使用分布式锁:在高并发情况下,使用分布式锁确保只有一个线程能同时更新缓存和数据库,从而避免一致性问题。
Step 2
Q:: 什么是缓存穿透?如何解决?
A:: 缓存穿透是指查询的数据既不在缓存中,也不在数据库中。由于缓存不命中,这类请求会直接打到数据库,可能导致数据库负载增加。常见的解决方案有:
1.
布隆过滤器:在缓存层前加一个布隆过滤器,用来快速判断请求的数据是否可能存在。如果布隆过滤器认为数据不存在,则直接返回,不再查询数据库。
2.
缓存空结果:如果查询数据库后数据确实不存在,可以将空结果(例如NULL)缓存起来,并设置一个较短的过期时间,避免频繁查询数据库。
Step 3
Q:: 什么是缓存雪崩?如何防止?
A:: 缓存雪崩是指大量缓存数据在同一时间过期,从而导致大量请求直接打到数据库,可能导致数据库压力过大甚至崩溃。常见的防止措施有:
1.
缓存失效时间随机化:通过为每个缓存设置一个随机的过期时间,避免所有缓存同时失效。
2.
加锁:对缓存的重建操作加锁,防止多个线程同时操作导致缓存雪崩。
3.
提前更新缓存:在缓存即将失效前,后台线程提前更新缓存,确保数据一直存在于缓存中。