购物车使用redis是怎么实现高性能、高并发的

购物车最常见的实现方式就是使用redis缓存来实现,他可以持久化防止重启丢失,而如果数据库存储会造成性能比较慢
实现方式使用redis中的hash结构实现,仔细研究会发现购物车是一个双重map结构 Map<String,Map<String,String>>
第一层Map,Key是用户id
第二层Map,Key是购物车中商品id,值是购物车数据

实现代码

注意里面的逻辑
首先你需要传一个视频id和购买数量,比如你买一个商品,是不是这个商品编号及购买数量
其次就要获取这个购物车,因为这个通用就把他封装成一个方法
其他的逻辑看代码介绍

@RestController
@RequestMapping("api/v1/cart")
public class CartController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private VideoDao videoDao;

    @GetMapping("add")
    public JsonData addCart(int videoId,int buyNum){
        //获取购物车
        BoundHashOperations<String, Object, Object> myCart = getMyCartOps();
        Object cacheObj = myCart.get(videoId+"");
        String result = "";

        //判断购物车是否为空

        if (cacheObj != null) {
            result = (String) cacheObj;
        }
        if (cacheObj == null) {
            //不存在则新建一个购物项
            CartItemVO cartItem = new CartItemVO();

            //从数据库查询详情,我们这边直接随机写个
            VideoDO videoDO = videoDao.findDetailById(videoId);
            videoDO.setId(videoId);

            //将购物项加入到购物车里面
            cartItem.setPrice(videoDO.getPrice());
            cartItem.setBuyNum(buyNum);
            cartItem.setProductId(videoId);
            cartItem.setProductImg(videoDO.getImg());
            cartItem.setProductTitle(videoDO.getTitle());
            myCart.put(videoId+"", JsonUtil.objectToJson(cartItem));

        } else {
            //存在则新增数量
            CartItemVO cartItem = JsonUtil.jsonToPojo(result, CartItemVO.class);
            cartItem.setBuyNum(cartItem.getBuyNum() + buyNum);
            myCart.put(videoId+"", JsonUtil.objectToJson(cartItem));
        }
        return JsonData.buildSuccess();
    }

    /**
     * 查看我的购物车
     * @return
     */
    @GetMapping("mycart")
    public JsonData findMyCart(){
        BoundHashOperations<String,Object,Object> myCart=getMyCartOps();

        List<Object> itemList=myCart.values();

        List<CartItemVO> cartItemVOList = new ArrayList<>();

        //遍历购物车商品详情,并存放到cartItemVOList当中

        for (Object item : itemList){
            CartItemVO cartItemVO = JsonUtil.jsonToPojo((String)item,CartItemVO.class);
            cartItemVOList.add(cartItemVO);
        }

        //封装成cartvo
        CartVO cartVO = new CartVO();
        cartVO.setCartItems(cartItemVOList);
        return JsonData.buildSuccess(cartVO);
    }

    /**
     * 清空我的购物车
     */
    @GetMapping("/clean")
    public JsonData clear() {
        String cartKey = getCartKey();
        redisTemplate.delete(cartKey);
        return JsonData.buildSuccess();
    }


    /**
     * 抽取我的购物车通用方法,使用hash结构
     */
    private BoundHashOperations<String, Object, Object> getMyCartOps() {
        String cartKey = getCartKey();
        return redisTemplate.boundHashOps(cartKey);
    }

    /**
     * 获取购物车的key
     */
    private String getCartKey() {
        //从拦截器获取用户 ,这里写死即可,每个用户不一样
        int userId = 88;
        String cartKey = String.format("product:cart:%s", userId);
        return cartKey;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值