问题分析
我们日常开发中,对于缓存用的最多的场景就像下图一样,可能仅仅是对数据进行缓存,减轻数据库压力,缩短接口响应时间。
这种方案在不需要考虑高并发得去写缓存,高并发得读写缓存时,是不会有问题,但是如果是在高并发场景下,要保证缓存和数据库的一致性,至少需要解决以下问题:
高并发写时的数据不一致问题
高并发读写时,请求执行各步骤的顺序是不可控的。假设此时有一个请求 A,B 都在在执行写流程,请求 A 是需要将某个数据改成 1,请求 B 是需要将某个数据改为 2,执行操作如下时就会导致数据不一致的问题:
1.请求 A 执行操作 1.1 删除缓存。
2.请求 A 执行操作 1.2 更新数据库,将值改为 1。
3.请求 B 执行操作 1.1 删除缓存。
4.请求 B 执行操作 1.2 更新数据库,将值改为 2
5.假设说请求 B 所在服务器网络延迟比较低,请求 B 先更新缓存,此时缓存中的 key 对应的 value 是 2。
6.请求 A 更新缓存,将缓存中 B 更新的数据进行覆盖,将 key 对应的值改为 1。
此时数据库中是 B 修改后的数据,值为 2,而缓存中的数据是 1,这样在缓存过期钱,用户读到的都是脏数据,与数据库不一致。
高并发读写时的数据不一致的问题
高并发读写时,请求执行各步骤的顺序是不