博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何保证缓存与数据库的双写一致性?
阅读量:5792 次
发布时间:2019-06-18

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

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

解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。

问题2:数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。完了,数据库和缓存中的数据不一样了...

解决思路(1):写请求先删除缓存,再去更新数据库,(异步等待段时间)再删除缓存(成功表示有脏数据出现)。

这种方案读取快速,但会出现短时间的脏数据。

解决思路(2):写请求先修改缓存为指定值,再去更新数据库,再更新缓存。读请求过来后,先读缓存,判断是指定值后进入循环状态,等待写请求更新缓存。如果循环超时就去数据库读取数据,更新缓存。

这种方案保证了读写的一致性,但是读请求会等待写操作的完成,降低了吞吐量

详细参考文章:

转载于:https://www.cnblogs.com/yueshutong/p/10716723.html

你可能感兴趣的文章
理解MySQL——架构与概念
查看>>
解决win7失去焦点问题
查看>>
centos 下 安装 xmapp
查看>>
判断英文单词的个数
查看>>
智能云,大有可为!IBM Bluemix注册教程!手把手带你领略云平台巅峰!
查看>>
5个理由告诉你为什么要学习使用Python装饰器
查看>>
‘InnoDB’ init function returned error.[mysql5.6]
查看>>
Starting supervisor: Unlinking stale socket /var/run/supervisor.sock
查看>>
写一个Mysql死锁的例子
查看>>
JAVA中几种常用的RPC框架介绍
查看>>
一致性概念
查看>>
Docker和虚拟机的区别
查看>>
图解排序算法之快速排序-单端探测法
查看>>
专家解惑丨带你从系统管理员角度深入了解 Docker
查看>>
Docker新功能曝光,一键自动生成 Dockerfile 和 Compose 文件
查看>>
区块链时代的拜占庭容错:Tendermint(二)
查看>>
xadmin配置
查看>>
061-linux服务器释放内存
查看>>
跨站漏洞防御——特殊字符转换
查看>>
常用算法概览
查看>>