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

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

时间:2024-07-15 15:44:34浏览次数:12  
标签:缓存 数据库 更新 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);
}

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

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

 

标签:缓存,数据库,更新,API,一致性,缓存数据,电商,数据
From: https://www.cnblogs.com/xdedm-Lisa/p/18303280

相关文章

  • RESTful API的设计与实现
    RESTfulAPI的设计与实现随着互联网的快速发展,Web应用程序的需求也日益增长。为了满足这些需求,开发人员需要一种标准的方式来设计和实现Web服务。REST(RepresentationalStateTransfer)作为一种轻量级的、遵循HTTP协议的Web服务架构风格,逐渐成为Web服务设计的首选。RESTful......
  • 在webapi中创建一个jwt token
    1.第一步首先创建一个webapi项目2.安装nuget包: Microsoft.AspNetCore.Authentication.JwtBearer3.,然后再Program.cs文件中添加 4.然后运行起来 5.打开jwt.io网站,解密token 关于:iss,sub,exp,iat,nbf更新信息看下图:  ......
  • ATTACKS ON THIRD-PARTY APIS OF LARGE LANGUAGE MODELS
    本文是LLM系列文章,针对《ATTACKSONTHIRD-PARTYAPISOFLARGELANGUAGEMODELS》的翻译。对大型语言模型第三方api的攻击摘要1引言2提出的流水线3实验4结论摘要大型语言模型(LLM)服务最近开始提供一个插件生态系统来与第三方API服务交互。这项创新增强了LLM的能......
  • AI学习 | chatgpt_api 和 tiktoken使用
    fromopenaiimportOpenAIimporttiktoken 如何使用chatgpttoken#创建实例,因为密钥已经传入环境变量,所以这里不用输入了client=OpenAI()#开始对话 response=client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role":"sys......
  • 【论文阅读】DeepREL通过自动化关系 API 推理对深度学习库进行模糊测试
    通过自动化关系API推理对深度学习库进行模糊测试论文基本信息ESEC/FSE’22,November14–18,2022,Singapore,Singapore时间:2022-11-07CCFA原文:https://doi.org/10.1145/3540250.3549085摘要近年来,深度学习(DL)受到广泛关注。同时,深度学习系统中的错误可能导致严重后......
  • Simple WPF: WPF使用Windows API发送Toast通知
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!以前看到Windows10的气泡通知觉得很有意思,但是一直不知道该如何实现。最近一次上网冲浪过程中偶然的机会看到了相关资料就自己来试试。本文介绍了在WPF......
  • Java中的日期和时间API详解
    Java中的日期和时间API详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在这篇文章中,我将详细介绍Java中的日期和时间API,包括旧版的Date和Calendar类,以及新版的java.time包中的类。通过丰富的代码示例,帮助大家全面了解和掌握Java中的日期和时间处理。1......
  • PHP转Go系列 | ThinkPHP与Gin框架之OpenApi授权设计实践
    大家好,我是码农先森。我之前待过一个做ToB业务的公司,主要是研发以会员为中心的SaaS平台,其中涉及的子系统有会员系统、积分系统、营销系统等。在这个SaaS平台中有一个重要的角色「租户」,这个租户可以拥有一个或多个子系统的使用权限,此外租户还可以使用平台所提供的开放API......
  • Win11系统提示找不到LockSearchAPI.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LockSearchAPI.dll文件(挑选合适的版本文件)......
  • fastapi和uvicorn设置监听ipv6
    fastapi和uvicorn设置监听ipv6启动程序时我们一般写的是uvicorn.run(app,host="0.0.0.0",port=8000)但是这样子启动的程序在纯ipv6或者双栈(同时有ipv4和ipv6)的机子上使用ip(v6):port访问是访问不到的,所以我们需要更改启动方式。直接参考GitHub的一个讨论,最佳......