1.购物车的几种实现方式

购物车的实现方式有很多,但是最常见的就三种:Cookie,Session,数据库.三种方法各有优劣,适合的场景各不相同.

  • Cookie方法:通过把购物车中的商品数据写入Cookie中,再通过浏览器进行读取.这个方法,适合在用户没有登录 的情况下使用,但是有个非常严重的缺点,即在用户禁用了Cookie的时候是无法使用的.
  • Session方法:通过Session来保存商品信息,这确实是个好的方法,适合用户已经登录的情况,将数据放在Session 中,用户就能读取购物车中的商品信息,而且速度十分的快.但是缺点也很明显,由于Session是建立在用户客户端 和服务器之间的,在Session中保存数据,无疑会增加服务器的负担.
  • 数据库:数据库无疑是一种非常棒的保存购物车中信息的有效途径,且能够持久化保存,但是问题也很明显,那就 是读取速度会差强人意。
  • 数据库优化方案:是可以使用 Cookie+redis 来存储购物车数据。

2.实现方案

京东实现思路: 当用户在未登录的情况下,将此购物车存入cookies , 在用户登陆的情况下,将购物车数据存入 redis 。如果用户登陆时,cookies中存在购物车,需要将cookies的购物车合并到redis中存储,清空cookies中的购物车。实际上京东在未登录状态下的购物车并不是完全保存到cookie中的,也是保存在服务端的。cookie中保存了一个 user-key

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_数据

登录后,

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_Cookie-Redis方案_02


购物车数据结构

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_json_03

在redis中我们可以使用两个hash来存储购物车数据。一个存储购物车的店铺信息,一个存储sku明细。

店铺 hash:

key

field

value

cart:{user-key}:info

店铺1Id

店铺1信息(json)

店铺2Id

店铺2信息(json)

店铺信息:

{ 
    "seller_id":"xiaomi", 
    "nickName":"小米官方旗舰店" 
}

商品hash:

key

field

value

cart:{user-key}:detail

sku1

sku1信息(json)

sku2

sku2信息(json)

sku信息:

{ 
    "item_id":12345678,
    "title":"ThinkPad笔记本 联想 A485 14英寸轻薄便携商务办公手提笔记本电脑锐龙",
    "sku_info":"03CD【标配】8G内存 128G+1TB双硬盘IPS FHD全高清屏 office Win10",
    "price":6887,
    "num":1, 
    "image":"http://imageserver/123444.jpg", 
    "goods_id":"234587582", 
    "seller_id":"lenovo", 
    "old_price":6887, 
    "onSell":true
}

添加购物车

添加一件商品,需要传入:商品id,Client_id(登录前保存到Cookie中的购物车信息),店铺id

后台接收到请求的参数后,根据商品id去mysql数据库查询商品对应的详细信息,即sku

查询到sku后,判断当前是否登录,如果未登录,根据Client_id取得购物车信息,返回购物车信息

如果登录,根据当前登录用户id查询购物车信息,返回购物车信息

然后查看购物车中是否已经存在商品,如果存在,直接加数量,不存在则添加sku

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_json_04


商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_redis_05


展示购物车

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_redis_06


商品信息修改

购物车信息是存到redis中的

商城项目的购物车为什么要放到redis 中 购物车用cookie还是session_Cookie-Redis方案_07