先更新数据库,再更新缓存场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改缓存中的数据,可能因为网络原因出现延迟,这个时候线程B,将数据修改成了3、然后将数据库中的1也改成了3,然后线程A恢复正常,将redis中的缓存改成了2,此时就出现了缓存数据和数据库数据不一致情况。不推荐

先更新缓存,再更新数据库场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,线程A先将redis中的数据修改为了2,然后CPU切换到了线程B,将redis中的数据修改为了3,然后将数据库中的信息也修改了3,然后线程A获得CPU执行,将数据库中的信息改为了2,此时出现缓存和数据库数据不一致情况。不推荐

先删除缓存,再更新数据库的场景-不推荐

当有两个线程A、B,同时对一条数据进行操作,当线程A进行修改缓存操作时,先删除掉缓存中的数据,然后去修改数据库,因为网络问题出现延迟,这时线程B查新redis没有值,因此去数据库中查询数据为1,然后将数据1更新到缓存中,线程A网络恢复,又将数据库数据修改为了2,此时出现数据不一致。不推荐

先更新数据库,在删除缓存场景-可以接受

一改一查场景

当有两个线程A、B,线程A先去将数据库的值修改为2,然后需要去删除redis中的缓存,当线程B去读取缓存时,线程A已经完成delete操作时,缓存不命中,需要去查询数据库,然后在更新缓存,数据一致性;

如果线程A没有完成delete操作(图中案例),线程B直接命中,返回的数据与数据库中的数据不一致,可能会短暂出现数据不一致情况,但最终都会一致。推荐

存在的问题

当数据过期或者初始化时,会出现数据不一致情况,也就是线程B从数据库中,查询到数据为tony,然后线程A将tony修改为了allen,然后去删除redis中的数据,然后线程B将读到的tony,更新到了数据库中,出现了数据不一致问题。

解决方案

对于不过期的数据我们要在上线的时候做好数据的预热,保证缓存命中。对于存在过期的数据,因为有过期时间,只会在特定的时间段内数据不一致,下次数据过期后,可以恢复,对于实时性要求不高时,可以接受。

两次修改场景

当有两个线程A、B,线程A去修改数据库中的值改为2,然后出现网络波动,线程B将数库中的值修改为了3,然后两个线程都会删除缓存,保证数据一致性。无非是线程A多删了一次。

最佳实现,数据异步同步

Canal:基于数据库增量日志解析,提供增量数据订阅和消费https://github.com/alibaba/canal

mysql会将操作记录在Binary log日志中,通过canal去监听数据库日志二进制文件,解析log日志,同步到redis中进行增删改操作。

canal的工作原理:canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议;MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal );canal 解析 binary log 对象(原始为 byte 流)。

Redis双写一致性相关推荐

  1. Redis 双写一致性问题分析

    Redis 双写一致性问题分析 1.更新数据库,不动缓存 只设置过期时间(兜底). 如果说业务不要求强一致性,这样就可以了,像12306抢票的时候,票数就不是准的,只要去下单买票的的时候,判断db的库 ...

  2. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

    0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所 ...

  3. redis 双写一致性 看一篇成高手系列1

    首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者 ...

  4. redis 双写一致性

    关于redis安装以及集群搭建这里就不做赘述了,小伙伴可以去redis官网看下详细的安装教程–http://www.redis.cn/download.html 或https://blog.csdn. ...

  5. redis 双写一致性 看一篇成高手系列 一

    首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者 ...

  6. 面试官: Redis 与 MySQL 双写一致性如何保证?

    前言 四月份的时候,有位好朋友去美团面试.他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题. ...

  7. 美团二面:Redis与MySQL双写一致性如何保证?

    前言 四月份的时候,有位好朋友去美团面试.他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题. ...

  8. Redis面试 - 如何保证缓存与数据库的双写一致性?

    Redis面试 - 如何保证缓存与数据库的双写一致性? 面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致 ...

  9. 【Redis】--缓存双写一致性分析、解决方案

    目录 一.缓存双写一致性场景 1.先更新数据库,再更新缓存 2.先更新数据库,再删除缓存 2.1.存在的问题一:删除缓存失败,导致Redis和mysql的数据不一致. 2.2.存在的问题二:删除缓存成 ...

最新文章

  1. 尤雨溪携手字节前端专家,畅聊 Vue 3.0 前端技术新趋势
  2. 微软宣布正式开源 Azure IoT Edge 边缘计算服务
  3. 2020年 | 云计算发展的5大趋势
  4. Kafka常用命令大全
  5. java 区号_求您!JAVA作业,窗口查询区号!
  6. java href_jnlp href属性中的url参数
  7. (C语言)验证哥德巴赫猜想,输入一个大于6的偶数,输出这个数能被分解为哪两个质数的和
  8. java考试题及答案翁凯,快来收藏!
  9. java 定时为每月10号_Java定时器的cron设置详解Quartz
  10. secureCRT免密码登陆Linux
  11. PWM/转速单闭环/转速电流双闭环电机控制Simulink仿真
  12. java mail 回复邮件_JavaMail - 退回邮件( Bounced Messages)
  13. Python--小游戏俄罗斯方块
  14. 免费生成!火爆全网的个人行程卡纪念版!
  15. 【趣题分享】关于蒋干盗书你所需要知道的
  16. 让绩效管理落到实处的七个要点
  17. 《工程电磁场》学习笔记0-矢量分析
  18. python qq机器人开发 利用Python读取QQ消息
  19. 分享7个神仙壁纸网站,让新的壁纸,给自己小小的雀跃,不陷入年年日日的重复。
  20. JDK基础脚本工具总结

热门文章

  1. 方向向量转欧拉角_如何将欧拉角转换为方向向量?
  2. Backprop Induced Feature Weighting for Adversarial Domain Adaptation with Iterative Label Distributi
  3. 由《旧制度与大革命》提取的5个感触
  4. c++之SQLite的增删改查
  5. 仿微信头像图片裁剪并压缩到100K以下到本地
  6. 读万卷书不如行万里路
  7. RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)
  8. windows自带的文件校验工具MD5,SHA1,SHA256,
  9. 分布式与集群的区别是什么?
  10. ASP.NET MVC图片文件上传与下载