购物车实现

目录

1.购物车常见的实现方式

2.购物车数据结构介绍

3.实例分析

1.controller层

2.service层 


1.购物车常见的实现方式

  • 方式一:存储到数据库
    • 性能存在瓶颈
  • 方式二:前端本地存储
    • localstorage在浏览器中存储 key/value 对,没有过期时间。
    • sessionstorage在浏览器中存储 key/value 对,在关闭会话窗口后将会删除这些数据。
  • 方式三:后端存储到缓存-redis
    • 可以开启AOF持久化防止重启丢失(推荐)
  • 方式四:后端存储到缓存-redis,并同步更新到数据库
    • 缓存和数据库的一致性,加了用户唯一标识后,没高并发操作同一数据的场景 

2.购物车数据结构介绍

  • 1.一个购物车中存在多个购物项
  • 2.使用双层Map,Map<String,Map<String,String>> 
    • 第一层map的key表示用户id
    • 第二层map的key表示商品id
  • 3.对应的reids使用hash结构  

3.实例分析

1.controller层

  @ApiOperation("添加到购物车")@PostMapping("/add")public JsonData addToCart(@ApiParam("购物的商品") @RequestBody CartItemRequest cartItemRequest){cartService.addToCart(cartItemRequest);return JsonData.buildSuccess();}

2.service层 

使用redis的hash结构模式进行存储

  • 1.根据拦截器获取用户id
  • 2.根据id拼接key
  • 3.根据key创建hash结构的购物车
  • 4.根据商品id查询购物车中是否存在
    • 5.1若不存在-添加商品到购物车
      • 6.根据商品的id,获取指定商品的详情,
      • 7.创建商品,并添加需要的信息
      • 8.以商品的id为键,以商品为值,转化为json字符串,缓存到redis中
    • 4.2.若存在-修改购买的数量
      • 6.根据key获取到的value,反转json,获取到商品
      • 7.修改购买的数量,原本数量+购买的数量
      • 8.以商品的id为键,以商品为值,转化为json字符串,缓存到redis中
@Slf4j
@Service
public class CartServiceImpl implements CartService {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate ProductService productService;/*** 添加商品到购物车** @param cartItemRequest*/@Overridepublic void addToCart(CartItemRequest cartItemRequest) {//1.获取商品信息Long productId = cartItemRequest.getProductId();Integer buyNum = cartItemRequest.getBuyNum();//2.根据用户id,获取购物车BoundHashOperations<String, Object, Object> myCart = getMyCartOps();//3.根据商品id的key,获取缓存中valueObject cacheObj = myCart.get(productId);String result = "";if (cacheObj != null) {result = (String) cacheObj;}//4.判断缓存中是否存在商品if (StringUtils.isBlank(result)) {//5.1若不存在,添加商品到购物车//6.创建购物商品CartItemVo cartItemVo = new CartItemVo();//7.获取商品详情ProductVo productVo = productService.detail(productId);if (productVo == null) {throw new MyException(CodeEnum.CART_FAIL);}//8.根据商品详情获取指定信息cartItemVo.setAmount(productVo.getAmount());//获取商品的价格cartItemVo.setBuyNum(buyNum);//获取买的数量cartItemVo.setProductId(productId);//商品的idcartItemVo.setProductImg(productVo.getCoverImg());//商品图片cartItemVo.setProductTitle(productVo.getTitle());//商品标题//9.以商品id为键,以根据id获取的商品对象为值,转换为json字符串存放到redis中myCart.put(productId, JSON.toJSONString(cartItemVo));} else {//5.2若存在,修改商品数量//6.根据key值,转换为商品类型,在获取CartItemVo cartItemVo = JSON.parseObject(result, CartItemVo.class);//7.修改买的数量,原本+后买的cartItemVo.setBuyNum(cartItemVo.getBuyNum() + buyNum);//8.重新放回myCart.put(productId, JSON.toJSONString(cartItemVo));}}/*** 使用redis中的hash结构** @return*/private BoundHashOperations<String, Object, Object> getMyCartOps() {//1.获取购物车keyString cartKey = getCartKey();return redisTemplate.boundHashOps(cartKey);}/*** 根据用户id创建购物车的key* 购物车key** @return*/private String getCartKey() {LoginUser loginUser = LoginInterceptor.threadLocal.get();String cartKey = String.format(CaptchaKey.CART_KEY, loginUser);return cartKey;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/307835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试-web

一、自动化测试理论&#xff1a; UI: User Interface &#xff08;用户接口-用户界面&#xff09;&#xff0c;主要包括&#xff1a;app 和webUI自动化测试&#xff1a;使用工具或代码执行用例的过程什么样的项目适合做自动化&#xff1a; 需要回归测试项目&#xff08;甲方自…

CH254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器&#xff0c;属于MCS-51单芯片的一种&#xff0c;由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司&#xff0c;所以有很多公司在做以8051为核心的单片机&#xff0c;如Atmel、飞利浦、深联华等公…

34-5 CSRF漏洞 - CSRF分类

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 1)GET 类型 传参: 参数连接在URL后面 POC构造及执行流程: 构造URL,诱导受害者访问点击利用利用标签进行攻击: 构造虚假URL,在链接上添加payload抓包获取数据包,通过CSRF POC…

JavaEE初阶Day 7:多线程(5)

目录 Day 7&#xff1a;多线程&#xff08;5&#xff09;1. 死锁2. 死锁场景3. 场景二&#xff1a;两个线程&#xff0c;两把锁4. 场景三&#xff1a;N个线程&#xff0c;M把锁5. 避免死锁问题6. 内存可见性问题 Day 7&#xff1a;多线程&#xff08;5&#xff09; 回顾synchr…

grpc-教程(golang版)

目录 一、介绍 二、环境准备 三、Golang中使用grpc 1.编写protobuf文件 2.服务端 3.客户端 四、proto文件详解 1.proto语法 2.数据类型 基本数据类型 数组类型 map类型 嵌套类型 编写风格 3.多服务 4.多个proto文件 五、流式传输 1.普通rpc 2.服务器流式 …

03-JAVA设计模式-责任链模式

责任链模式 什么是责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;允许你将请求沿着处理者链进行传递。每个处理者均对请求进行某些处理&#xff0c;并可决定是否将请求沿着链传递下去。这种模式给予请求的处理…

使用 Meltano 将数据从 Snowflake 导入到 Elasticsearch:开发者之旅

作者&#xff1a;来自 Elastic Dmitrii Burlutskii 在 Elastic 的搜索团队中&#xff0c;我们一直在探索不同的 ETL 工具以及如何利用它们将数据传输到 Elasticsearch&#xff0c;并在传输的数据上实现 AI 助力搜索。今天&#xff0c;我想与大家分享我们与 Meltano 生态系统以及…

ThreadX:怎么确定一个线程应该开多少内存

ThreadX&#xff1a;如何确定线程的大小 在实时操作系统&#xff08;RTOS&#xff09;ThreadX中&#xff0c;线程的大小是一个重要的参数。这个参数决定了线程的堆栈大小&#xff0c;也就是线程可以使用的内存空间。那么&#xff0c;我们应该如何确定一个线程需要多大的字节呢…

应用实战|从头开始开发记账本2:基于模板快速开始

上期视频我们创建好了BaaS服务的后端应用。从这期视频开始&#xff0c;我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战&#xff5c;从头开始开发记账本2&#xff1a;基于模板快速开始 相关代码 本期视频我们介绍…

37% 的公开共享文件暴露个人信息

许多存储在 Google Drive、Slack 和其他协作工作应用程序等平台上的敏感文档几个月甚至几年都无人看管。根据 Metomic 的“金融服务数据安全状况”报告&#xff0c;这给公司带来了数据蔓延的挑战&#xff0c;也给个人及其雇主带来了重大的数据安全威胁。 86% 的文件在 90 天内…

问题汇总

一、TCP的粘包和拆包问题&#xff1f; TCP在发送和接受数据的时候&#xff0c;有一个滑动窗口来控制接受数据的大小&#xff0c;这个滑动窗口你就可以理解为一个缓冲区的大小。缓冲区满了就会把数据发送&#xff0c;数据包的大小是不固定的&#xff0c;有时候比缓冲区大有时候…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支&#xff0c;各个分支相互独立&#xff0c;互不干扰 分支的相关命令&#xff0c;具体如下&#xff1a; git branch 查看分支 git branch [name] 创建分支&#x…

04异常Lambda算法正则

异常 异常是什么&#xff1f; 异常是代码在编译或者执行的过程中可能出现的错误。避免异常的出现&#xff0c;同时处理可能出现的异常&#xff0c;让代码更稳健。 异常分为几类&#xff1f; 编译时异常、运行时异常。编译时异常&#xff1a;没有继承RuntimeExcpetion的异常…

Android适配平板屏幕尺寸

一、划分手机和平板 人为判断方法: 大于6英寸的就是平板。小于6英寸的都是手机 平板尺寸&#xff1a; 6英寸、7英寸、10英寸、14英寸… Android系统支持多配置资源文件&#xff0c;我们可以追加新的资源目录到你的Android项目中。命名规范&#xff1a; 资源名字-限制符 l…

c++调python接口

1. 新建run.py文件&#xff0c;并定义相关接口&#xff1a; import numpy as np from scipy.fftpack import fftdef str_add(str1,str2):return int(str1) int(str2)def my_sort(data):data.sort()return datadef aw_fft(data, Fs):N len(data)result np.abs(fft(xdata, n…

Git 解决分支冲突

一、前言 一直习惯于 add commit push 的三步走&#xff0c;偶然间看到了一个评论说在 push 之前还有一个 pull&#xff0c;小小的疑问就埋在了我的心里。于是我就先了解了 pull 的工作原理&#xff0c;就是先拉取代码&#xff08;fetch&#xff09;再合并分支&#xff08;mer…

C语言-----结构体详解

前面已经向大家介绍过一点结构体的知识了&#xff0c;这次我们再来深度了解一下结构体。结构体是能够方便表示一个物体具有多种属性的一种结构。物体的属性可以转换为结构体中的变量。 1.结构体类型的声明 1.1 结构体的声明 struct tag {member-list;//结构体成员变量 }vari…

数字化时代:IT界的致富秘籍 —— 策略×态度×机遇

&#x1f31f; 数字化时代&#xff1a;IT界的致富秘籍&#x1f680; —— 策略态度机遇 在数字化浪潮中冲浪&#x1f3c4;‍♂️&#xff0c;IT行业犹如一片无限可能的蓝海。想要在这片汹涌的海洋中捕获财富&#xff0c;不是一件轻而易举的事。让我们一起深入探索&#xff0c;如…

(学习日记)2024.04.16:UCOSIII第四十四节:内存管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…