首页 > 数据库 >基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构

基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构

时间:2023-12-03 10:02:12浏览次数:50  
标签:存储 缓存 架构 userId Redis 购物车 商品 hash 电商

社区电商的购物车缓存架构

在购物车中的功能主要有这几个:商品加入购物车、查看购物车列表、删除购物车商品、选中购物车商品进行结算

这里购物车的场景和之前用户信息以及菜谱分享信息还不同,如果在举办了大型购物活动时,购物车可能需要面临写多读少或者写多读多的场景,面临高并发的读和写,那么在购物车中就以 Redis 作为主存储,异步的将数据进行落库持久化

商品加入购物车

那么我们先来看一下商品加入购物车的业务场景,当将一个商品加入购物车,流程如下:

商品加入购物车,首先需要判断,商品是否已经在购物车中存在了,那么就分了两种情况,如果商品在购物车中已经存在,我们需要去对购物车中该商品的数量 +1 ,然后在缓存中更新购物车里这个商品的信息,最后发送更新消息到 MQ 中进行异步落库;如果商品在购物车中不存在,那么就直接去缓存中添加购物车里该商品的信息,再发送持久化消息到 MQ 中进行落库

那么缓存中需要存储的数据以及存储使用的数据结构如下:

  • 用户购物车已有商品的数量:使用 hash 来存储,这个商品的数量用于在用户添加商品到购物车时,判断购物车中的商品数量是否超过购物车商品数量的上限
key -> shopping_cart_hash:{userId} 
field -> skuId,即商品的 id
value -> 存储商品的数量
存储结构为:
shopping_cart_hash:{userId} {
  {skuId}: count1,
  {skuId}: count2
}
  • 商品的详情信息:使用 hash 来存储
key -> shopping_cart_extra_hash:{userId}
field -> skuId
value -> 商品详情
存储结构为:
shopping_cart_extra_hash:{userId} {
  {skuId}: "商品详情json串",
  {skuId}: "商品详情json串"
}
  • 存储购物车商品的顺序:使用 zset 存储,用于查询购物车的商品时使用
key -> shopping_cart_zset:{userId}
value -> skuId
score -> System.currentTimeMillis()  分数使用当前系统的时间戳即可,按照加入购物车的时间对商品进行排序

那么添加购物车商品的流程如下:

基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构_Redis

在 MQ 中订阅更新消息和持久化消息即可,这里注意在订阅更新消息时,是更新用户购物车中的商品信息,那么有可能是增加商品的数量也有可能是减少商品的数量,所以在数据库中我们要判断,如果商品的数量更新后为 0 的话,就直接删除掉这条数据就好了

以及要做一些数据校验,如商品的数量最小值为 0,不可以为负数,这些都是业务层面上的考虑

这里的购物车存储架构使用 Redis 作为主存储,MySQL 作为持久化,那么如果 Redis 崩溃无法使用的话,MySQL 也可以作为一个备用存储,基于 MySQL 做一个降级处理,在 Redis 恢复的时候,可以将数据库中的数据再重新加载到 Redis 中来

就算 Redis 中一些数据没来得及发送到 MQ 进行消息落库,影响也不大,购物车中的数据在未提交订单之前,本来就是临时数据,丢一个影响不大

查询购物车中商品

查询购物车中的商品的话,直接从 Redis 中进行查询,先按照商品加入购物车的时间,查询出来所有的商品 id,再根据商品 id 去查询商品的详情,这个流程还是比较简单的

购物车中的商品是根据加入购物车的时间加入到 zset 中去的,那么查询的话使用 zrevrange shopping_cart_zset:{userId} 0 -1 根据 score 获取从大到小排序的商品 id

再根据这些商品 id 去 Redis 的 hash 中查数据的商品的详情信息,通过 hgetall shopping_cart_extra_hash:{userId} 来获取该用户购物车中的所有商品信息,将这些商品信息返回即可

购物车中商品在缓存中的可视化存储结构如下图:

基于社区电商的Redis缓存架构-写多读多场景下的购物车缓存架构_数据_02

选中购物车中的商品

在商品实体类中,通过一个字段 flag 来控制该该商品是否被选中了,如果选中该商品,就将 flag 设置为 1,如果取消选中,就将 flag 设置为 0

选中商品之后,直接在缓存中更新该商品的详情即可,也就是对 key=shopping_cart_extra_hash:{userId},field={skuId} 的商品详情信息进行更新

总结

  • 写多读多、写多读少的场景,以 Redis 作为主存储,通过 MQ 异步将数据进行落库持久化
  • 如果存在读出来数据,并对读出来的数据进行修改的场景的话,就要考虑是否存在并发问题了,如果存在的话,要加分布式锁进行控制

标签:存储,缓存,架构,userId,Redis,购物车,商品,hash,电商
From: https://blog.51cto.com/u_16186397/8664750

相关文章

  • 如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
    缓存雪崩数据末加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。比如一个雪崩的简单过程1、redis集群大面积故障2、缓存失效,但依然大量请求访问缓存服务redis3、redis大量失效后,大量请求转向到mysql数据库4、mysql的......
  • 什么是电商领域的 drop sale
    "Dropsale"是电商领域的一种销售策略,通常指的是在特定时间点、短暂时间内发布限量商品,以抢购的形式进行销售。这种销售模式旨在通过短时间内的高度紧张和竞争,刺激消费者的购买欲望,从而达到快速销售产品的目的。在Dropsale中,商品的数量有限,往往比较稀缺,因此消费者需要迅速采取......
  • 【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关
    2023年6月17日,中国开源软件推进联盟PostgreSQL分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题,结合当下信创热潮、人工智能等产业变革背景,探讨PostgreSQL数据库在这些新机遇下的发展前景。峰会邀请众多行业大咖、学术精英、技术专家、技术爱好者......
  • 【DTCC 2022】云原生数据库PieCloudDB全新eMPP架构是如何炼成的
    12月14-16日,第十三届中国数据库技术大会(DTCC2022)在线上隆重召开。拓数派赞助并参与了数据库盛会DTCC,在会议中,拓数派CTO郭罡分享了《云原生数据库PieCloudDB eMPP架构设计与实现》的主题演讲。在演讲中,郭罡分析了传统分布式MPP架构的痛点,介绍了云原生数据库PieCloudDB的eMPP架......
  • 『Postgres.Live 技术沙龙回顾』揭秘 PieCloudDB Database eMPP 架构设计
    2月1日,拓数派参与了由开源软件联盟PostgreSQL分会组织的Postgres.Live线上系列沙龙活动。拓数派产品及推广总监吴疆发表主题演讲《PieCloudDB:eMPP云原生数据库》。相关视频回放欢迎访问拓数派B站链接,PPT欢迎前往官网链接获取。本文由演讲内容整理而成。随着计算机技术的发展,”云......
  • Spring Cloud Alibaba:构建微服务架构的高效工具套件
    SpringCloudAlibaba:构建微服务架构的高效工具套件SpringCloudAlibaba是一套基于SpringCloud微服务架构的开发工具,它提供了丰富的微服务解决方案,包括服务注册与发现、负载均衡、熔断与限流、安全认证与授权等。SpringCloudAlibaba结合了阿里巴巴的微服务实践和SpringCl......
  • Caffeine Cache缓存
    SpringBoot集成CaffeineCaffeine和SpringCache依赖,使用注解方法实现缓存依赖<!--提供SpringBoot中的缓存支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</......
  • 基于AI的架构优化:创新数据集构造法提升Feature envy坏味道检测与重构准确率
    本文分享自华为云社区《华为云基于AI实现架构坏味道重构取得业界突破,相应文章已被软工顶会FSE2023收录》,作者:华为云软件分析Lab。基于AI技术实现架构坏味道检测与重构建议是当前业界比较流行的做法,但此做法往往存在一个通病,即训练数据集的质量问题,如何构建大规模、高质量的训练......
  • 软考架构师(12)——嵌入式相关
    一:嵌入式系统概论嵌入式系统的特点包括:(1)系统专用性强。(2)软、硬件依赖性强。(3)系统实时性强。(4)处理器专用。(5)多种技术紧密结合。(6)系统透明性。(7)系统资源受限。实时系统的概念实时系统可以看成对外部事件及时响应的系统。现实世界中,并非所有的嵌入式系统都具有实时特性,所有的实......
  • 软考架构师(14)——面向对象方法
    0:基本概念面向对象方法包括:面向对象分析,面向对象设计,面向对象程序设计一:统一建模语言(UML)1:UML结构UML结构包括UML的基本构造块,支配这些构造块如何放在一起的规则(架构)和一些运用于整个UML的机制(1)构造块:事物:UML中的事物也称为建模元素,包括结构事物(structuralthings)、行为事物......