【电商API】缓存数据与数据库保持一致如何实现呢?

2024年,电商真正跨入了新时代。

在这个新时代,工具、方法、体系……都在升级,堪称一日千里。

商家如何更好地顺应时代的变化?2024年,我给大家的建议总结为两句话。

第一句是借平台的红利;

第二句是建立自己的体系。

如何利用电商API数据采集接口,完成自己的主流电商数据采集

前言

如果项目业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时架构模型是这样的:

但随着业务量的增长,项目业务请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。这个阶段通常的做法是,引入环城缓存来提高读性能,架构模型就变成了这样:

一、谈谈一致性

首先,我们先来看看有哪几种一致性的情况呢?

  • 强一致性:如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。读请求和写请求会串行化,串到一个内存队列里去,这样会大大增加系统的处理效率,吞吐量也会大大降低。
  • 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
  • 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。一般情况下,高可用只确保最终一致性,不确保强一致性。

二、 情景分析

针对读场景

请求查询数据,如果命中缓存,那么直接取缓存数据返回即可。如果请求中不存在,数据库中存在,那么直接取数据库数据返回,然后将数据同步到Redis中。不会存在数据不一致的情况。

针对写场景 

如果该数据在缓存中不存在,那么直接修改数据库中的数据即可,不会存在数据不一致的情况。

  • 当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。
  • 在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,就去数据库里查,还是以上面商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况。

三、同步策略

想要保证缓存与数据库的双写一致,一共有4种方式,即4种同步策略:

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

public void deleteRedisData(UserInfo userInfo){
    // 删除Redis中的缓存数据
    jedis.del(userInfo);
    // 更新MySQL数据库数据
    userInfoDao.update(userInfo);
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch(Exception exp){
        exp.printStackTrace();
    }
    // 删除Redis中的缓存数据
    jedis.del(userInfo);
}

五、结语

对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。

把今天最好的表现当作明天最新的起点......

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 15:42:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 15:42:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 15:42:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 15:42:01       69 阅读

热门阅读

  1. go 的HTTP请求处理

    2024-07-15 15:42:01       17 阅读
  2. 洛谷 P1162 填涂颜色

    2024-07-15 15:42:01       23 阅读
  3. wxz196二次消谐装置的消除功能介绍

    2024-07-15 15:42:01       18 阅读
  4. js的call和apply

    2024-07-15 15:42:01       18 阅读
  5. netty创建tcp服务端+客户端

    2024-07-15 15:42:01       19 阅读
  6. Python循环遍历:深入理解与实战应用

    2024-07-15 15:42:01       23 阅读
  7. 【Unity】制作简易计时器

    2024-07-15 15:42:01       20 阅读
  8. 文件读写的视频存在这里

    2024-07-15 15:42:01       16 阅读