1.购物车的几种实现方式
购物车的实现方式有很多,但是最常见的就三种:Cookie,Session,数据库.三种方法各有优劣,适合的场景各不相同.
- Cookie方法:通过把购物车中的商品数据写入Cookie中,再通过浏览器进行读取.这个方法,适合在用户没有登录 的情况下使用,但是有个非常严重的缺点,即在用户禁用了Cookie的时候是无法使用的.
- Session方法:通过Session来保存商品信息,这确实是个好的方法,适合用户已经登录的情况,将数据放在Session 中,用户就能读取购物车中的商品信息,而且速度十分的快.但是缺点也很明显,由于Session是建立在用户客户端 和服务器之间的,在Session中保存数据,无疑会增加服务器的负担.
- 数据库:数据库无疑是一种非常棒的保存购物车中信息的有效途径,且能够持久化保存,但是问题也很明显,那就 是读取速度会差强人意。
- 数据库优化方案:是可以使用 Cookie+redis 来存储购物车数据。
2.实现方案
京东实现思路: 当用户在未登录的情况下,将此购物车存入cookies , 在用户登陆的情况下,将购物车数据存入 redis 。如果用户登陆时,cookies中存在购物车,需要将cookies的购物车合并到redis中存储,清空cookies中的购物车。实际上京东在未登录状态下的购物车并不是完全保存到cookie中的,也是保存在服务端的。cookie中保存了一个 user-key 的cookie值。
登录后,
购物车数据结构
在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中的