DB缓存一致性
直接硬核干货,去掉前戏。
方案大致说明
1:假设对redis中存在一对key,value的对应关系是 key=money,value=666
2:当修改线程修改key时先将key设置成value=666_write,(这里需要说明的是:线上实际应用可以将_wirte改成非常复杂的UUID等字符串,只要保证不要和线上实际set的值冲突即可,例如666_write_@#$%^&*_qwerty
3:当读取时发现key的存在读取标识666_read_@#$%^&*_qwerty,发现有其他读取线程已经在从DB中load数据了,这种情况休眠一下重试就可以了,不需要从DB中load数据,因为这样做会引起大量线程访问数据库引发灾难。如果不存在读取标识则判断一下是否含有写入标识若不存在则直接返回数据即可,若存在读取标识将所有读取标识去掉之后看看是否为空,不为空则返回当前value即可。
4:为什么一个字符串会出现多个写入标识呢。假设线程A和B对 key=money,value=666的数据进行修改,那么线程A将value变成了value=666_write_@#$%^&*_qwerty,这个时候线程B也来掺和一下,会变成666_write_@#$%^&*_qwerty_write_@#$%^&*_qwerty,这个地方是需要注意的。同时也会出现业务数据被删除了这个时候加上了修改标记,value变成_write_@#$%^&*_qwerty这种只有修改标识但是没有业务数据的的情况。
5:还有一个需要特别注意的是setnx在客户端2.8之后 支持超时时间,这块需要设置一个超时的时间处理,防止读取线程setnx之后服务器挂了,引起永远无法同步的问题,至于超时时间设置成多少和实际环境有关。
6:同时也会出现_read_@#$%^&*_qwerty_write_@#$%^&*_qwerty这种同时带有read和write的情况,出现在并发读取的场景。
7:这种需要DB缓存强一致读写应该在master中进行,不应该在slave中读,很有可能出现延迟导致问题
8:redis主从切换这种极端的场景出现在读取或者修改的情况下也会引起数据不一致的问题,一般上线这种问题的解决方案是跨机房多机缓存或者允许短期内不一致的job任务定时校验兜底等。
总结起来就是一下几点:
当存在_read_@#$%^&*_qwerty时说明有读取线程正请求DB,从新load对象。
当存在_write_@#$%^&*_qwerty时说明当前key正在被写入。
当存在多个_write_@#$%^&*_qwerty时 存在并发修改。
当有_read_@#$%^&*_qwerty和_write_@#$%^&*_qwerty时 存在读和写的并发。
读取详细设计方案

更新时设计方案:

其他问题加群讨论吧 QQ群号:825199617。
DB缓存一致性的更多相关文章
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- 缓存一致性和跨服务器查询的数据异构解决方案canal
当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观, ...
- Web应用中的缓存一致性问题
上篇总结了缓存中出现频率比较高的一些问题,今天详细说说web应用中的缓存一致性问题. 主要说以下三个方面 数据库与缓存中数据不一致出现的情形 发生不一致时的优化思路 如何保证数据库与缓存的一致性 先来 ...
- Redis缓存穿透、击穿、雪崩,数据库与缓存一致性
Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...
- Java的多线程机制系列:(二)缓存一致性和CAS
一.总线锁定和缓存一致性 这是两个操作系统层面的概念.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性.首先处理器需要保证读一个字节或写一个 ...
- Web集群缓存一致性的思考
共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...
- 缓存一致性(Cache Coherency)入门
作者: Fabian “ryg” Giesen 来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...
- 缓存一致性(Cache Coherency)入门(转)
参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是RAD Game Tools程序员Fabian “ryg” Giese ...
- 分布式缓存一致性hash算法理解
今天阅读了一下大型网络技术架构这本苏中的分布式缓存一致性hash算法这一节,针对大型分布式系统来说,缓存在该系统中必不可少,分布式集群环境中,会出现添加缓存节点的需求,这样需要保障缓存服务器中对缓存的 ...
随机推荐
- 数据仓库之抽取数据:通过bcp命令行导入数据
原文:数据仓库之抽取数据:通过bcp命令行导入数据 在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区中的数据进行转换,最后 ...
- opencv-04--图像金字塔
图像金字塔被广泛应用于各种视觉应用中.图像金字塔是一个图像集合,集合中图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样.(当然,降为一个像素肯定是中止条件 ...
- Python练习_集合和深浅拷贝_day7
1. 1.作业 1.把列表中所有姓周的人的信息删掉(升级题:此题有坑, 请慎重): lst = ['周老二', '周星星', '麻花藤', '周扒皮'] 结果: lst = ['麻花藤'] 2.车牌区 ...
- javascript--HTML DOM常用元素对象
二,Select:访问select元素 属性:.selectedIndex 获取select中当前选中项的下标 .options 获取select中所有的option元素 返回值为数组 .opti ...
- CVE-2019-0213: Apache Archiva Stored XSS
CVE-2019-0213: Apache Archiva Stored XSS Severity: Low Vendor:The Apache Software Foundation Version ...
- 13.MyBatis注解式开发
mybatis 的注解,主要是用于替换映射文件.而映射文件中无非存放着增.删.改.查 的 SQL 映射标签.所以,mybatis 注解,就是要替换映射文件中的 SQL 标签. mybatis 官方文档 ...
- el-table——可编辑拖拽转换csv格式的表格
<!--可拖拽的表格:表格内容+行参数+按钮名称(对话框标题)--> <template> <div> <el-button size="mini& ...
- InnoDB全文索引
### 如果想了解全文索引,可以直接将本文复制到mysql的新建查询中,依次执行,即可了解全文索引的相关内容及特性. -- InnoDB全文索引 -- 建表 CREATE TABLE fts_a ( ...
- shell code
- centos下关闭自动锁屏
自己这段时间在学习Linux,选用的系统的为CentOS,在实际操作过程中遇到问题,在无任何操作情况下,系统过一段时间自动锁屏需要重新输入密码.经过多次尝试以后终于成功!解决方法如下: Setting ...