博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存与数据库一致性解决方案
阅读量:3962 次
发布时间:2019-05-24

本文共 856 字,大约阅读时间需要 2 分钟。

如何保证缓存与数据库的双写一致性?

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。

读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新的时候,先更新数据库,然后再删除缓存。

为什么是删除缓存,而不是更新缓存?

其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想。查询一个部门,部门带了一个员工的 list,没有必要说每次查询部门,都把里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。

这种先更新数据库再删缓存也会出现数据不一致的情况

先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致,这还是有问题的

如果是先删缓存再更新数据库呢

在高并发的情况下也会出现不一致的情况

比如线程1先删除了缓存的数据,还没来得及更新数据库,此时线程2来读数据,缓存里面没有,就读数据库,然后把数据更新进缓存,此时线程1开始更新数据库,此时缓存里面是老数据,数据库里面是新数据,出现缓存不一致的情况。

解决方案一 延迟双删策略

在这里插入图片描述

在这里插入图片描述

解决方案二 异步更新缓存

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

说简单点就是将读请求和写请求串行化放进一个队列中去,让他们按顺序执行

比如我现在有个更新的请求,我将它放进一个队列,开启一个异步的线程让它去消费队列,我先删除缓存,还没来得及更新数据库的时候,来了一个读请求,将它放进队列去,排在更新请求后面,它必须等更新请求操作完后才能执行,此时更新请求继续更新数据库,更新数据库后,读请求开始操作,先读缓存,缓存没有,然后读取数据库,把数据库的内容写进缓存,此时数据库和缓存还是一致的

转载地址:http://vqhzi.baihongyu.com/

你可能感兴趣的文章
QTP之——Failed to run script. Description: 没有注册类别
查看>>
Perl+Eclipse配置
查看>>
Perl练习之——微型计算器
查看>>
Perl练习之——循环语句
查看>>
Ruby解决方案:The 'ffi' native gem requires installed build tools ; 含最新DevKit下载地址
查看>>
Python之操作MySQL数据库(二)
查看>>
简单介绍如何使用robotium进行自动化测试
查看>>
Python之操作XML文件
查看>>
eclipse+ADT 进行android应用签名详解
查看>>
Robotium只有apk文件例如Music.apk
查看>>
UI自动化测试框架对比(二)
查看>>
Selenium-webdriver系列教程(9)——如何操作select下拉框
查看>>
Selenium-webdriver系列教程(10)——如何智能的等待页面加载完成
查看>>
Robotium测试NotePad(一)
查看>>
Robotium测试NotePad(二) //测试添加文本
查看>>
Robotium测试NotePad(二) //测试删除文本
查看>>
Robotium只有apk文件时进行测试
查看>>
Robotium测试NotePad(三) //测试修改文本
查看>>
怎样有效降低测试的轮次?
查看>>
功能测试用例设计策略
查看>>