1、本地保存方式
我实现的购物车是不需要登录就可以添加商品到购物车那种,保存的方式为cookie,把购物车列表转成json串保存到cookie中,设置有效期为7天。
2、服务端保存方式(需要用户登录后)
为了实现登录状态用户的购物车是永久保存的,我需要把购物车信息放到服务端,这里我选择的是把购物车放到了redis缓存中,而非数据库中,减少I/O操作。
3、查询方式
用户在登录状态,则操作的是redis缓存中的购物车信息,非登录状态,则操作的是cookie中的购物车信息。
4、同步方式(用户进行登录操作的时候)
如何实现用户登录后把本地的购物车信息同步到服务端,我这里的思路是,用户一旦登录,则把cookie中的购物车和redis中同步,然后删除cookie中的购物车信息。
部分同步代码块:
//得到cookie中的购物车
List<TbItem> cookieCart = getCartList(request);
//得到缓存中的购物车
String cartjson = jedisClient.hget(USER_CART_PREFIX, String.valueOf(user.getId()));
List<TbItem> redisCart = JsonUtils.jsonToList(cartjson, TbItem.class);
//用cookie中的每一个商品id 和redis中的商品id比较
//id相同则redis中对应商品的数量相加 都不同则添加到redis购物车中
for (TbItem tbItem : cookieCart) {
boolean flag = false;
for(TbItem item : redisCart){
//缓存中和cookie中都有的商品
if(tbItem.getId() == item.getId().longValue()){
item.setNum(tbItem.getNum()+item.getNum());
flag = true;
break;
}
}
//缓存中没有的商品
if(!flag){
redisCart.add(tbItem);
}
}
//添加到缓存中
jedisClient.hset(USER_CART_PREFIX, String.valueOf(user.getId()), JsonUtils.objectToJson(redisCart));