当前位置: 首页 > news >正文

东莞专业做淘宝网站外贸网站外链平台

东莞专业做淘宝网站,外贸网站外链平台,wordpress食品模板,凡科 预约网站文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…

文章目录

    • 1. 读取数据
    • 2. 写数据
      • 2.1 先操作缓存
      • 2.2 先操作数据库

在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。

1. 读取数据

image-20240808112851354

当用户查询数据时,首先先到Redis中进行查询,如果没有命中,则到数据库中进行查询。在数据库中查询到数据后,将数据返回,并且存入到Redis中,设置过期时间,设置过期时间是为了避免长时间未使用的数据一直存放在Redis中,占用内存空间。

2. 写数据

用户在写入数据时,要操作Redis和DataBase。有以下几种操作:

先操作Redis缓存

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

先操作DataBase数据库

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

对于是更新Redis中的数据,还是删除Redis中的数据,其实更推荐是删除Redis中的数据。

因为,如果是选择修改Redis数据,而不是删除,那么如果再修改Redis数据成功后,再去更新数据库中的数据时失败,这样就会导致Redis和DataBase中的数据不一致。再或者如果先成功更新了数据库中的数据,再去更新Redis中的数据时失败了,那么下次查询到Redis中的数据虽然存在,但是为错误数据。

在更新缓存与删除缓存之中,我们确定了是使用删除Redis缓存中的数据。那么剩下的一个问题就是,先更新数据库,还是先删除Redis缓存?

对于这两种情况,我们分别进行讨论。

2.1 先操作缓存

image-20240808140156405

先操作缓存,也就是先将Redis中的数据删除,然后再更新DataBase中的数据。

数据不一致

考虑这种情况下会出现的问题:

  1. Redis中的数据成功被删除了。
  2. 在数据被写入数据库之前,此时有线程2存在,线程2读取DataBase中的数据,读取成功后存入了Redis中。
  3. 线程2从DataBase中读取数据后,线程1的新数据写入DataBase。
  4. 此时再去读取数据时,因为Redis中数据存在,所以会直接读取Redis中的数据,但是Redis中的数据是旧数据,此时就出现了数据不一致问题。

image-20240808141454554

出现上述这种情况时,该如何解决呢?

双删)有一种解决方法:

  1. Redis中的数据成功被删除了
  2. 在数据被写入数据库之前,此时有线程2存在,线程2读取DataBase中的数据,读取成功后存入了Redis中。
  3. 线程2从DataBase中读取数据后,线程1的新数据写入DataBase。
  4. 线程1的新数据写入DataBase后,再次执行将Redis中的数据删除。
  5. 此时再去读取数据时,因为Redis中数据不存在,所以会到DataBase中查询数据,再将查询到的数据存入Redis中,这样保证了数据的一致性。

image-20240808142513505

但是,这种处理方法,还是存在一种缺陷。如以下情况:

  1. 线程1更新数据,Redis中的数据成功被删除了。
  2. 线程2读取数据,先查缓存,缓存中数据不存在,查询数据库,查询到旧数据。
  3. 线程1删除Redis数据成功后,将新数据写入数据库。
  4. 线程1将新数据写入数据库后,删除Redis中的缓存数据。
  5. 线程2将查询到的旧数据返回,并将数据写入到Redis中。
  6. 此时,Redis中的数据为旧数据,又导致了Redis与数据库中数据不一致的问题。

image-20240808142952938

为了解决上述问题,我们可以将第5步操作进行延迟。在上诉例子中,也就是让线程2先将旧数据存入到Redis中,线程1再去删除Redis中的数据。这种处理方法称为延迟双删

对于先操作缓存,再操作数据库的情况中,处理数据不一致性问题,我们一般采用延迟双删的方法进行处理。

2.2 先操作数据库

image-20240808144242932

先操作数据库,也就是先更新DataBase中的数据,然后再将Redis中的数据删除。

此时,线程2存在,如果数据再Redis中存在,那么不会出现数据不一致问题。

线程2查询数据,首先查询缓存,数据存在直接返回,只是线程2可能查到的为旧数据,但是这并不影响Redis与DataBase的数据一致性。

image-20240808144818490

除了这种情况外,还有一种情况存在。Redis中不存在被更新的该数据。那么就会出现以下情况:

  1. 线程2查询数据,先查询Redis中的数据,数据不存在,到数据库中查询数据,查询到旧数据。
  2. 线程1更新数据库中的数据。
  3. 线程1更新完数据库中的数据后,执行对Redis中数据的删除操作。
  4. 线程2将查询到的旧数据存储到Redis中。此时就出现了数据不一致行问题。

image-20240808145124373

对于这种情况,我们对于图中第4步操作还是采用延迟删除进行处理。

但是这种情况下,也会存在一种问题,就是第3步操作,删除缓存失败。针对这种删除缓存失败的情况,我们可以采用删除重试机制进行解决。我们可以引入MQ消息队列。

image-20240808150609362

但是,加入了删除重试后,非业务代码和业务代码耦合度太高了。

我们想解耦的话,就可以采用另一个组件,叫做canal

canal是阿里的一款开源框架,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。

Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。

image-20240808151104257

http://www.jinmujx.cn/news/76919.html

相关文章:

  • 会议网站建设的意义百度app在哪里找
  • 外贸网站制作哪家好青岛网络优化厂家
  • 怎么登录企业网站百度刷seo关键词排名
  • 学生做的网站百度还原
  • wordpress文章美观杭州百度seo优化
  • 前端网站怎么做广点通广告平台
  • 鹤山今日最新新闻南京百度推广优化
  • 网站seo推广方案seo关键词排名怎么提升
  • 网站推广有哪些手段网络营销八大目标是什么
  • wordpress 回收站在哪里南宁关键词优化软件
  • 织梦如何做电商网站dsp投放方式
  • 锡林郭勒盟建设厅官方网站全国十大婚恋网站排名
  • seo网站建设流程惠州seo排名优化
  • 怎么做网站备份百度seo入驻
  • googl浏览器做桌面版网站抖音十大搜索关键词
  • 免费的建网站软件广州网络推广外包
  • 提供图片做网站的要求今日新闻摘抄
  • 台州专业制作网站seo网站培训优化怎么做
  • 安阳工学院图书馆找做网站的书在哪宁波优化seo软件公司
  • 物流网站建设方案权限管理深圳网站设计制作
  • 深圳做网站设计场景营销
  • 废旧回收做哪个网站好网站域名备案信息查询
  • 太原做网站的通讯公司有哪些网络推广企划
  • wordpress 主题导出网站专业术语中seo意思是
  • 鞍山公司做网站软文营销的作用有哪些
  • 中山 网站建设开发网络营销的特点举例说明
  • 大人和小孩做系列网站媒体发稿费用
  • 网络营销外包推广系统株洲seo快速排名
  • 济南营销型网站建设工作室自己怎么创建一个网站
  • 网站软文得特点如何刷app推广次数