ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

在库存服务中实现缓存与数据库双写一致性保障方案

2022-01-31 13:03:08  阅读:131  来源: 互联网

标签:缓存 请求 队列 代码 更新 一致性 操作 双写



更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个jvm内部的队列中

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

一个队列对应一个工作线程

每个工作线程串行拿到对应的操作,然后一条一条的执行

这样的话,一个数据变更的操作,先执行,删除缓存,然后再去更新数据库,但是还没完成更新

此时如果一个读请求过来,读到了空的缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成

这里有一个优化点,一个队列中,其实多个更新缓存请求串在一起是没意义的,因此可以做过滤,如果发现队列中已经有一个更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接等待前面的更新操作请求完成即可

待那个队列对应的工作线程完成了上一个操作的数据库的修改之后,才会去执行下一个操作,也就是缓存更新的操作,此时会从数据库中读取最新的值,然后写入缓存中

如果请求还在等待时间范围内,不断轮询发现可以取到值了,那么就直接返回; 如果请求等待的时间超过一定时长,那么这一次直接从数据库中读取当前的旧值

int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

(queueNum - 1) & hash

1、线程池+内存队列初始化

@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
servletListenerRegistrationBean.setListener(new InitListener());
return servletListenerRegistrationBean;
}

java web应用,做系统的初始化,一般在哪里做呢?

ServletContextListener里面做,listener,会跟着整个web应用的启动,就初始化,类似于线程池初始化的构建

spring boot应用,Application,搞一个listener的注册

2、两种请求对象封装

3、请求异步执行Service封装

4、两种请求Controller接口封装

5、读请求去重优化

6、空数据读请求过滤优化

队列

对一个商品的库存的数据库更新操作已经在内存队列中了

然后对这个商品的库存的读取操作,要求读取数据库的库存数据,然后更新到缓存中,多个读

这多个读,其实只要有一个读请求操作压到队列里就可以了

其他的读操作,全部都wait那个读请求的操作,刷新缓存,就可以读到缓存中的最新数据了

如果读请求发现redis缓存中没有数据,就会发送读请求给库存服务,但是此时缓存中为空,可能是因为写请求先删除了缓存,也可能是数据库里压根儿没这条数据

如果是数据库中压根儿没这条数据的场景,那么就不应该将读请求操作给压入队列中,而是直接返回空就可以了

都是为了减少内存队列中的请求积压,内存队列中积压的请求越多,就可能导致每个读请求hang住的时间越长,也可能导致多个读请求被hang住

这边跟大家提前说一下,打个招呼

我的风格,跟其他一些人不太一样,我都是课上纯实时手写代码的,没有说提前自己先练个10遍(也没那时间),也不是说预先写好,然后放ppt,课程里就copy粘贴

我就是思路梳理出来,然后边讲课边写代码

就是跟真实的开发的时候是一样的,可能会犯各种各样的错误,可能会写出来bug

有可能有些错误,或者是疏忽的地方,自己课程上就发现了,然后就纠正了; 也可能我没发现自己一些遗漏的地方,QQ+我,然后跟我反馈

视频随时可以补充进去,纠错的一些东西

talk is cheap, show me the code

写代码,还有一个问题,我们是课程上现场写代码,第一遍写代码,写出来的代码,面向对象的设计,设计模式的运用,然后代码结构的设置,都不是太完美,甚至可能是有点粗糙

公司里做项目,其实那个代码会改来改去,重构,代码会变得越来越规整

课程里没办法,大家如果觉得我的代码写的不太好,比如说觉得我哪里本来应该用个设计模式,结果没有用

很重要的废话

这套课程,主要还是讲解架构的,面向架构

架构,很虚,说说说

架构还是得落地,落地还是要写代码的,不管大家是什么层级的人,开发,高工,架构师,技术总监,项目经理

所有的代码跟着一点一点写一下

标签:缓存,请求,队列,代码,更新,一致性,操作,双写
来源: https://www.cnblogs.com/q1359720840/p/15858174.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有