点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

作者:Finley

www.cnblogs.com/Finley/p/12615111.html

当执行写操作后,需要保证从缓存读取到的数据与数据库中持久化的数据是一致的,因此需要对缓存进行更新。

因为涉及到数据库和缓存两步操作,难以保证更新的原子性。

在设计更新策略时,我们需要考虑多个方面的问题:

  • 对系统吞吐量的影响:比如更新缓存策略产生的数据库负载小于删除缓存策略的负载

  • 并发安全性:并发读写时某些异常操作顺序可能造成数据不一致,如缓存中长期保存过时数据

  • 更新失败的影响:若某个操作失败,如何对业务影响降到最小

  • 检测和修复故障的难度: 操作失败导致的错误会在日志留下详细的记录容易检测和修复。并发问题导致的数据错误没有明显的痕迹难以发现,且在流量高峰期更容易产生并发错误产生的业务风险较大。

更新缓存有两种方式:

  • 删除失效缓存: 读取时会因为未命中缓存而从数据库中读取新的数据并更新到缓存中

  • 更新缓存: 直接将新的数据写入缓存覆盖过期数据

更新缓存和更新数据库有两种顺序:

  • 先数据库后缓存

  • 先缓存后数据库

两两组合共有四种更新策略,现在我们逐一进行分析。

并发问题通常由于后开始的线程却先完成操作导致,我们把这种现象称为“抢跑”。下面我们逐一分析四种策略中“抢跑”带来的错误。

先更新数据库,再删除缓存

若数据库更新成功,删除缓存操作失败,则此后读到的都是缓存中过期的数据,造成不一致问题。

可能发生的并发错误:

先更新数据库,再更新缓存

同删除缓存策略一样,若数据库更新成功缓存更新失败则会造成数据不一致问题。

可能发生的并发错误:

当两个写线程发生冲突时,可以通过比较数据版本方式避免线程A写入旧的数据。

先删除缓存,再更新数据库

可能发生的并发错误:

先更新缓存,再更新数据库

若缓存更新成功数据库更新失败, 则此后读到的都是未持久化的数据。因为缓存中的数据是易失的,这种状态非常危险。

因为数据库因为键约束导致写入失败的可能性较高,所以这种策略风险较大。

可能发生的并发错误:

异步更新

双写更新的逻辑复杂,一致性问题较多。现在我们可以采用订阅数据库更新的方式来更新缓存。

阿里巴巴开源了mysql数据库binlog的增量订阅和消费组件 - canal。

我们可以采用API服务器只写入数据库,而另一个线程订阅数据库 binlog 增量进行缓存更新的策略。关注Java知音公众号,回复“面试题聚合”,送你一份面试题宝典

这种策略存在和先更新数据库后删除缓存类似的并发问题:

这个问题同样可以采用异步线程更新缓存,且写入缓存时比较数据版本的方法来解决。

热门内容:原创 | Nginx 架构原理科普百度 71 个炸天的开源项目!你知道几个?
原来这才是 Kafka!(多图+深入)如何设计一个牛逼的本地缓存最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・

讲讲 Redis 缓存更新一致性相关推荐

  1. redis做mysql缓存的优点_面试官:如何保障数据库和redis缓存的一致性

    随着互联网的高速发展,使用互联网产品的人也越来越多,团队不可避免得也会面对越来越复杂的高并发业务场景(如下图),比如热点视频/文章的观看(读场景),热点视频/文章的评论,点赞等(写场景). 众所周知, ...

  2. 【Redis】Redis 缓存更新方案分析

    前言 在业务环境中,频繁访问数据库获取数据的做法是不可取的,为了提升数据请求的效率,目前比较流行的做法就是使用 Redis 缓存服务,将频繁被请求的数据缓存起来,在下一次数据被请求时,根据设定的 ke ...

  3. 小工匠聊架构-Redis 缓存一致性设计

    文章目录 Pre 思路 Spring 注解使用:控制 Redis 缓存更新 一致性问题是如何产生的? 双更新模式:操作不合理,导致数据一致性问题 "后删缓存"能解决多数不一致 (C ...

  4. Redis:缓存一致性问题(缓存更新策略)

    Redis缓存的一致性 1. 缓存 1.1 缓存的作用: 1.2 缓存的成本: 2. 缓存模型 3. 缓存一致性问题 3.1 引入 3.2 解决 (1) 主动更新:先更新数据库,再手动删除缓存 (2) ...

  5. Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...

  6. MySQL与Redis缓存问题-开课吧

    Redis是一个由C语言开发的数据库.为了避免使用MySQL要求过度影响性能,它将被使用.Mysql和redis数据在高并发场景中的一致性不容忽视. MySQL和Redis缓存的一致性. 场景:线程A ...

  7. Redis缓存雪崩缓存击穿缓存穿透

    Redis缓存雪崩&缓存击穿&缓存穿透 一 缓存更新策略 二 缓存雪崩 三 缓存击穿 四 缓存穿透 一 缓存更新策略 目前redis缓存更新存在3种主流策略,分别是:内存淘汰.超时剔除 ...

  8. SpringBoot缓存管理(二) 整合Redis缓存实现

    SpringBoot支持的缓存组件 觅波小说网 https://www.3812.info 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springfr ...

  9. Redis - 缓存雪崩,缓存穿透,缓存击穿

    Redis是一个完全开源的,遵守BSD协议的,高性能的key-value的数据存储结构系统,它支持数据持久化,可以将内存中的数据保存在磁盘中.不仅支持简单的key-value类型的数据结构,同事还提供 ...

最新文章

  1. 极速理解设计模式系列【目录索引】
  2. 调试笔记--jlink 变量转实时波形小技巧
  3. SAP Commerce Cloud Spartacus UI 的购物车 Cart 功能
  4. fis 详细介绍(mac版) - 12-26没有弄完 - 暂停
  5. .data()与.detach()的区别
  6. pandas计算移动平均值
  7. 深度学习资料挑的眼花啦?小夕帮你做选择!
  8. [2012.04.03] Windows Phone 上的汉语拼音以及多音字处理
  9. JavaScript面向对象:类、方法、属性
  10. ●洛谷P2606 [ZJOI2010]排列计数
  11. pdftomusic pro(音乐谱曲软件) v1.0.4
  12. 【React】JSX 语法及原理
  13. 游戏开发之NGUI字体集制作
  14. 【机器学习】缺失值处理总结
  15. HTML中<a></a>标签的四大功能 必看!必看!!必看!!!
  16. 鸽子的迷信行为(pigeon superstition)
  17. 求职套题2---各大公司
  18. Python 变量赋值和命名规则
  19. PHP删除字符串中的空格和换行符终极方法
  20. 2022年,谁在推动产业数字化进入“奇点”时刻?

热门文章

  1. linux安装ActiveMQ
  2. JAVA SHA1 加密 对应 c# SHA1 加密
  3. js markdown chart flow
  4. 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解(二)
  5. (转载)新年——顺民的牢骚
  6. Datawhale组队学习:数据结构与算法课程任务
  7. 【怎样写代码】函数式编程 -- Lambda表达式(一):引出
  8. 【C#串口编程计划】C#串口协议解析 -- 文本数据
  9. 利用BP神经网络教计算机进行非线函数拟合(代码部分多层)
  10. 技术沙龙 | TeaTalk 带你深度探索 SDN 网络技术再创新