博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何保证缓存与数据库的双写一致性?
阅读量:4041 次
发布时间:2019-05-24

本文共 871 字,大约阅读时间需要 2 分钟。

Cache Aside Pattern

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。

读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。

三种方案如下:

  • 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,高并发下效率大大降低。
  • 先更新数据库,再删除缓存

为什么是删除缓存,而不是更新缓存?

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。更新操作开销大多,而这一时段如果读少则造成程序的开销增大。

这种方案也是程序在用的,同时也是与程序松耦合的方案。针对数据库更新成功,缓存删除失败的情况,canal监控到变化则数据库更新成功,缓存删除失败增加了消息队列进行重试机制。

canal监控mysql的变化,如果数据更新,则进行删除缓存操作,如果删除缓存失败,则把删除操作放入消息队列中,自己进行消费该消息进行删除重试。

image

图片以及这种方案详细内容来源

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

更新数据库的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。

即更新数据库缓存操作,读取数据时(缓存不存在)放到内存队列中,同时读取数据等待队列处理超时问题(超时先查询数据库返回)

高并发的场景下,该解决方案要注意的问题:

  • 读请求长时阻塞

超时返回,同时提前做好服务到压测跟预估

  • 读请求并发量过高
  • 多服务实例部署的请求路由

nginx路由到相同服务事例上

  • 热点商品的路由问题,导致请求的倾斜

更多详细的介绍参看文章:

                                           

 

总结:

其实秒杀商品的库存大部分都是存放到redis中,库存只更新缓存的。

先删除缓存再更新数据库,存在缓存击穿问题(大量读请求过来,都走了数据库),同时增加了代码复杂性。

先更新数据库,再删除缓存,通过松耦合的情况,大部分场景能满足。

当然特殊场景需要特殊策略对待。

转载地址:http://ogadi.baihongyu.com/

你可能感兴趣的文章
能源化工要怎么管控核心数据
查看>>
制药医疗使用云盘能带来什么样的好处
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
设计行业运用企业云盘能带来什么样的变化
查看>>
如何运用企业云盘助力企业数字化新发展
查看>>
企业云盘可以在哪些行业发光发热
查看>>
为什么汽车制造业需要企业云盘
查看>>
企业云盘和旅游行业碰撞在一起会产生怎样的火花
查看>>
医疗制药企业要怎么进一步进行系统的管理
查看>>
企业云盘如何让能源电力行业乘上数字化发展列车
查看>>
企业云盘为什么说是互联网软件公司的好帮手
查看>>
企业云盘为媒体广告业打造一站式文件管理协作平台
查看>>
教育行业推动校园信息化建设的重中之重
查看>>
咨询服务行业如何利用专用工具提升自我价值
查看>>
智慧与安全共济共同服务公共事业
查看>>
是谁在背后默默支撑教育行业加速进程教育信息化2.0
查看>>
企业云盘为司法行业注入电子数据化新动力
查看>>
什么样的东西让科技行业如虎添翼
查看>>