购物车实现

目录

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.mzph.cn/news/813182.shtml

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

相关文章

程序员为啥不自己单干?想过,但是

偶尔被问&#xff0c;程序员都能开发公司的软件了&#xff0c;为啥不做个软件自己卖。作为写了近10年代码的程序员&#xff0c;来分享一下这个话题。 据了解&#xff0c;每个程序员都想过去做一款自己的产品去赚钱&#xff0c;包括我。有人只是想过&#xff0c;有人去做过了&a…

配置VM开机自启动

1. 在此电脑-右键选择“管理”-服务和应用程序-服务中找到VMware Workstation Server服务&#xff08;新版名称也可能是VMware自启动服务&#xff0c;自己找一下&#xff0c;服务属性里有描述信息的&#xff09;&#xff0c;将其启用并选择开机自动启动 新版参考官方文档&…

蓝桥杯【第15届省赛】Python B组

这题目难度对比历届是相当炸裂的简单了…… A&#xff1a;穿越时空之门 【问题描述】 随着 2024 年的钟声回荡&#xff0c;传说中的时空之门再次敞开。这扇门是一条神秘的通道&#xff0c;它连接着二进制和四进制两个不同的数码领域&#xff0c;等待着勇者们的探索。 在二进制…

ReactRouter

React-Router 概念&#xff1a;一个路劲path对应一个组件component 当我们在浏览器中访问一个path的时候&#xff0c;path对应的组件会在页面中进行渲染路由语法&#xff1a; import {createBrowserRouter, RouterProvider} from react-router-dom// 1. 创建router实例对象并…

【算法刷题 | 回溯思想 02】4.12(电话号码的字母组合)

文章目录 4.电话号码的字母组合4.1问题4.2解法&#xff1a;回溯4.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 4.2.2代码实现 4.电话号码的字母组合 4.1问题 给定一个仅包含数字 2-9 的字符…

threejs 基础知识点汇总

threejs 基础知识点汇总 之前写了几篇博文&#xff0c;但是我觉得写的不好&#xff0c;我今天再补充一篇还不好的&#xff0c;把基础知识点汇总一下&#xff0c;不写运行的代码了&#xff0c;只写关键代码&#xff0c;但是看了之前我写的那几篇&#xff0c;看这篇的话问题其实不…

jdk17 你还想用ScriptEngineManager来执行js代码?

今天要用java来执行配置表的js代码&#xff0c;用 ScriptEngine javaScriptEngine new ScriptEngineManager().getEngineByName(“javascript”); 一直抛异常&#xff1a;Cannot invoke “javax.script.ScriptEngine.eval(String)” because “javaScriptEngine” is null 网上…

简单瞎搞题(位运算优化背包问题)

题目链接 这可不是瞎搞&#xff0c;出题人是有bear来。查资料时遇见的例题&#xff0c;当练习写一下。做法是位运算bitset优化的背包。 思路&#xff1a; 相当于有 n n n 组&#xff0c;每组选一个物品&#xff0c;然后问最后得到的重量之和是多少。不看位运算优化的话&…

Springboot集成Elastic-job

ElasticJob 通过弹性调度、资源管控、以及作业治理的功能&#xff0c;打造一个适用于互联网场景的分布式调度解决方案&#xff0c;并通过开放的架构设计&#xff0c;提供多元化的作业生态。 1 项目集成 1.1 springboot项目配置 导入依赖&#xff1a; <!--mysql连接基本配…

SSL证书添加与ICP备案,对于SpringBoot的要求

配置了SSL证书之后&#xff0c;在SpringBoot的resources文件夹里的application.properties会添加以下代码&#xff1a; server.port443 不需要添加server.address。不然会报错。 https类型的请求默认在Postman里面不可请求。 经过SSL证书处理的网页&#xff0c;链接中使默认…

【kears】keras使用介绍

文章目录 一.特点二.keras如何支持TensorFlow、CNTK 和 Theano2.1 使用 TensorFlow 后端引擎训练和评估模型2.2 使用 TensorFlow 后端引擎训练和评估模型2.3 使用 Theano后端引擎训练和评估模型2.4 不同深度学习框架如何选择 三.使用步骤3.1 导入库3.2 构建模型3.3 编译模型3.4…

【经验】java时区问题

首先得有一个预备知识 时间戳&#xff1a;指1970-01-01 00:00:00(GMT/UTC)起到当前的毫秒数。与时区无关&#xff0c;不同时区同一个时刻的时间戳是相同的。所以&#xff0c;时间戳不受时区影响。但是&#xff0c;不同时区的国家同一个时间戳显示的日期不同&#xff0c;所以同一…

解锁区块链技术的潜力:实现智能合约与DApps

在数字时代&#xff0c;区块链技术正迅速成为重塑多个行业的革命性力量。从金融服务到供应链管理&#xff0c;再到数字身份验证&#xff0c;区块链提供了一种去中心化、安全和透明的数据处理方式。在本文中&#xff0c;我们将深入探讨区块链技术&#xff0c;特别是智能合约和去…

LDRA Testbed软件静态分析_常见问题及处理

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

水经微图IOS版5.2.0发布

随时随地&#xff0c;微图一下&#xff01; 水经微图&#xff08;简称“微图”&#xff09;IOS新版已上线。 在该版本中主要新增图层树节点排序功能、常规&#xff08;矩形、圆、椭圆、扇形&#xff09;绘制功能、地形夸张等主要功能。 当前版本 当前版本号为&#xff1a;5…

c++容器:string的模拟实现

文章目录 定义命名空间和类构造函数拷贝构造析构函数返回string的大小和容量operator[]operator迭代器beginendreservepush_backappendoperatorinserterase 定义命名空间和类 namespace shh {class string{private:char* _str nullptr;size_t _size 0;size_t _capacity 0;}…

鹏哥C语言复习——数据存储

目录 版本差异&#xff1a; 数据类型&#xff1a; 进制表示&#xff1a; 大小端储存&#xff1a; 数据运算&#xff1a; 浮点型在内存中的存储&#xff1a; 版本差异&#xff1a; debug和release的区别&#xff1a; 在栈区开辟地址一般是先从高地址开辟 debug创建数组和单…

代码随想录算法训练营33期 第三十六天 |435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 class Solution { public:static bool cmp(const vector<int>& a, const vector<int>& b){return a[0]<b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end()…

蓝桥集训之修理牛棚

蓝桥集训之修理牛棚 核心思想&#xff1a;贪心 先把所有牛棚合成一块木板然后将所有间隙大小求出 排序找到最大的n-1个总长度 - n-1个间隙 得到剩下n个木板总长度 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const i…

C#入门理解设计模式的6大原则

**设计模式的原则是指导设计模式创建和应用的基本原则&#xff0c;这些原则有助于创建灵活、可维护且可扩展的软件系统。**1. 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09; 单一职责原则指出一个类应该只有一个引起它变化的原因。换句话说&…