Redis 双写一致性问题分析

1、更新数据库,不动缓存 只设置过期时间(兜底)。

如果说业务不要求强一致性,这样就可以了,像12306抢票的时候,票数就不是准的,只要去下单买票的的时候,判断db的库存就行了。

2、删除缓存   更新数据库

读写并发问题:

(1)线程A删除缓存

(2)线程B查询数据,发现缓存数据不存在

(3)线程B查询数据库,得到旧值,写入缓存

(4)线程A将新值更新到数据库

这样一来,缓存中的数据仍然是旧值 ,这种情况下属于更新数据事务原子性问题,需要用分布式锁来解决。

3、  更新数据库  删除缓存

同样面临上面高并发读写导致缓存不一致问题。

4、延时双删,内存队列

延时双删这个方案,能解决一定问题,但是延时的时长不好把控,这直接与性能挂钩,但是时间短了,又会有并发问题。个人不建议。

内存队列这个方案,感觉实现复杂,耦合度变高,个人不建议。

5、异步删除

拿数据库记录,通过消息队列,消费删除或更新缓存,

1、这里就是说不保证强一致性,消费的越快,一致性越强

如过消费的超快,是不是还是有旧值写到缓存?

2、与业务完全解耦

6、 个人想法: 不管是先删除缓存还是先更新数据库 ,都是说读到了旧值,待更新删除完后,把旧值又写到缓存了。

那么能不能,当我读请求后,如果有写,我就不写缓存行不行?

这里缓存读模式有更改,需要重写缓存管理接口并兼容以前的模式,另外需要内存空间存flag的key,性能应该比锁强一点。

总结:

1、完全不考虑,能简单就简单,首选1方案

2、并发小,允许高并发下一些key不一致,2,3方案都可以,必须强一致,2,3方案考虑加锁

3、并发高,考虑5方案

4、至于个人方案,能不能通过损失ap和内存空间,来达到强一致,暂时只是个想法。

Redis 双写一致性问题分析相关推荐

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

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

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

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

  3. redis 双写一致性

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

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

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

  5. Redis双写一致性

    先更新数据库,再更新缓存场景-不推荐 当有两个线程A.B,同时对一条数据进行操作,一开始数据库和redis的数据都为1,当线程A去修改数据库,将1改为2,然后线程A在修改缓存中的数据,可能因为网络原因 ...

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

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

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

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

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

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

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

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

最新文章

  1. python计算文件中字母出现次数_python – 计算文本文件中字母的频率
  2. 并行计算框架 Apache Hama
  3. 前端开发之JavaScript基础篇四
  4. Spring Boot Dubbo 应用启停源码分析
  5. 卸载一直在创建还原点_Win10电脑开机一直转圈无法进入系统的解决方法
  6. 企业级NGINX的重定向rewrite
  7. HDU - 3571 HDU CakeMan(bfs+最短路必经点)
  8. 听说,99%的数学家都算不出这道题
  9. 解决mapper映射文件不发布问题
  10. u盘安装linux 提示no such device_IGH EtherCAT 开源主站安装及测试
  11. 【数据结构】堆的建立(边输入数据边建立)(给定数字顺序插入)
  12. vue组件化的基本使用
  13. 感谢同事的临别赠言,愿自己一路顺风。
  14. Mysql replace/insert into 插入修改数据
  15. ​巴比特发布2020年数据报告:平台年度阅读量突破16亿,活跃作者超500名
  16. Linux刻录光盘win10认不到,win10系统刻录光盘光驱无法识别光盘的具体方法
  17. 实体对齐 算法_[2017]Bootstrapping Entity Alignment with Knowledge Graph Embedding
  18. IOS gif图片播放 swift
  19. Mysql连接命令join
  20. ip代理软件的原理到底是什么?适用场景有哪些?

热门文章

  1. [2017-08-21]Abp系列——如何使用Abp插件机制(注册权限、菜单、路由)
  2. 通过距离感应器获取实际距离[FAQ04538][Sensor]java层获得P_sensor距离传感器当前真实值,不止0,1
  3. 前端----html---第一天
  4. 图像基本特征-颜色 纹理 形状
  5. CTF题库RSA实践 (RSA-Tool2 by tE! 工具的使用)
  6. Linux之线程Thread小结
  7. 记一次vue^2.6.5-router^3.0.6的keep-alive事故
  8. matlab模拟出现较大误差是什么原因,【求助】matlab 对复杂计算会出现较大误差吗?...
  9. TS学习(二) :安装ts与ts配置
  10. socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数