直接硬核干货,去掉前戏。

方案大致说明

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缓存一致性的更多相关文章

  1. 由一个bug引发的SQLite缓存一致性探索

    问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...

  2. 缓存一致性和跨服务器查询的数据异构解决方案canal

    当你的项目数据量上去了之后,通常会遇到两种情况,第一种情况应是最大可能的使用cache来对抗上层的高并发,第二种情况同样也是需要使用分库 分表对抗上层的高并发...逼逼逼起来容易,做起来并不那么乐观, ...

  3. Web应用中的缓存一致性问题

    上篇总结了缓存中出现频率比较高的一些问题,今天详细说说web应用中的缓存一致性问题. 主要说以下三个方面 数据库与缓存中数据不一致出现的情形 发生不一致时的优化思路 如何保证数据库与缓存的一致性 先来 ...

  4. Redis缓存穿透、击穿、雪崩,数据库与缓存一致性

    Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...

  5. Java的多线程机制系列:(二)缓存一致性和CAS

    一.总线锁定和缓存一致性 这是两个操作系统层面的概念.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性.首先处理器需要保证读一个字节或写一个 ...

  6. Web集群缓存一致性的思考

    共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...

  7. 缓存一致性(Cache Coherency)入门

    作者: Fabian “ryg” Giesen  来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...

  8. 缓存一致性(Cache Coherency)入门(转)

    参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是RAD Game Tools程序员Fabian “ryg” Giese ...

  9. 分布式缓存一致性hash算法理解

    今天阅读了一下大型网络技术架构这本苏中的分布式缓存一致性hash算法这一节,针对大型分布式系统来说,缓存在该系统中必不可少,分布式集群环境中,会出现添加缓存节点的需求,这样需要保障缓存服务器中对缓存的 ...

随机推荐

  1. (十一)web服务与javaweb结合(2)

    一.解决问题及解决方法 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致. 解决方案:将webService绑定到web工程中,使得共用一个端口. 二.案例 2.1 ...

  2. HTTP协议探究(六):H2帧详解和HTTP优化

    一 复习与目标 1 复习 HTTP1.1存在的问题 HTTP2.0要兼容HTTP1.1 HTTP2.0的重要概念 分帧层 二进制:流 消息 帧 流的状态.优先级和并发 流量控制 服务器推送 首部压缩 ...

  3. asp.net类似于js中的setTimeOut()的函数作用?

    asp.net类似于js中的setTimeOut()的函数作用? 插入这行即可,定时2秒,再运行下一步: System.Threading.Thread.Sleep(); 加个随机数 Random r ...

  4. K2 BPM_【解决方案】从流程梳理到落地,K2为企业打造流程管理闭环_全业务流程管理专家

    很多企业在进行流程管理体系建设的过程中,往往急于求成,还没有理清楚要“做什么”和“怎么做”,就开始大刀阔斧地进行改革优化.管理目标.建设标准的不统一,使得体系建设之间内容重复.要求冲突等现象层出不穷. ...

  5. Spring中Bean的管理问题

    首先,配置文件中定义的bean并不是都在启动时实例化. <bean id="accountService" class="com.foo.DefaultAccoun ...

  6. 面试总结关于Spring面试问题(精选)

    1.什么是Spring? Spring是一个反转控制IOC和AOP的开发框架和平台. 2.解释一下Spring? 轻量 : Spring 在大小和透明度上是轻量的,Spring基本核心版本大概只有1M ...

  7. 更优雅地关闭资源 - try-with-resource及其异常抑制--转载

    原文地址:https://www.cnblogs.com/itZhy/p/7636615.html 一.背景 我们知道,在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必 ...

  8. 使用.bat 批量将部分文件迁移到新的路径下

    1.建一个11.bat ,里面写  :   dir  /b /s  >1111.txt 保存后运行 即将所有的文件路径保存到1111.txt中 2.可以将获取的路径复制到execl中,找到自己需 ...

  9. CentOS7安装CDH 第六章:CDH的管理-CDH5.12

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  10. 特殊权限 - SUID GUID STICKYBIT

    ◆ SUID ( Set User ID ) Linux里,用户的ID被称作UID.在实际生产中,可能需要临时借用别的用户执行程序,因此需要能够临时变更自己UID的机能叫做SUID.借助SUID权限, ...