在实际应用 Redis 缓存时,我们经常会遇到一些异常问题,概括来说有 4 个方面:
- 缓存中的数据和数据库中的不一致
- 缓存雪崩
- 缓存击穿
- 缓存穿透
缓存和数据库的数据不一致是如何发生的?
Redis、数据库的操作不是原子操作
如何解决数据不一致问题?
重试机制
- 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(例如使用 Kafka 消息队列)。当应用没有能够成功地删除缓存值或者是更新数据库值时,可以从消息队列中重新读取这些值,然后再次进行删除或更新。
- 如果能够成功地删除或更新,我们就要把这些值从消息队列中去除,以免重复操作,此时,我们也可以保证数据库和缓存的数据一致了。否则的话,我们还需要再次进行重试。如果重试超过的一定次数,还是没有成功,我们就需要向业务层发送报错信息了。
先删除缓存,再更新数据库
- 延迟双删
先更新数据库值,再删除缓存值