原文网址:Redis--保证缓存与数据库的一致性--解决方案_IT利刃出鞘的博客-CSDN博客
简介
本文介绍如何保证Redis缓存与数据库的数据一致性。
问题由来
缓存流程如下:
缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存;又或者是先删除缓存,再更新数据库呢?也就是说如何保证双写一致性呢?
本文不适合秒杀的情况。秒杀一般是如此设计的:把数据库中的库存数据转移到Redis缓存中,所有读写操作(比如:查库存、减库存)都在Redis中进行,然后再通过定时任务把Redis中的用户秒杀的数据同步到数据库中。
方案1:先更新数据库,再更新缓存(不建议)
这套方案,大家是普遍反对的。为什么呢?有如下两点原因。
原因一(线程安全角度)
同时有请求A和请求B进行更新操作,那么会出现以下问题:请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。这就导致了脏数据,因此不考虑。如下所示:
- 线程A更新了数据库
- 线程B更新了数据库
- 线程B更新了缓存
- 线程A更新了缓存
上边只是部分内容,为便于维护,本文已迁移到此地址:Redis-保证缓存与数据库的一致性-解决方案 - 自学精灵