@Service
public class CartServiceImpl implements CartService {
private static final String CART="Cart_";
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private SkuFeign skuFeign;
@Autowired
private SpuFeign spuFeign;
/**
* 添加购物车
* @param skuId
* @param num
*/
@Override
public void add(String skuId, Integer num,String username) {
/**
* 1)查询redis中的数据
* 2)如果redis中已经有了,则追加数量,重新计算金额
* 3)如果没有,将商品添加到缓存
*/
OrderItem orderItem = (OrderItem) redisTemplate.boundHashOps(CART+username).get(skuId);//从redis中取值 if (orderItem != null){
//存在,刷新购物车
orderItem.setNum(orderItem.getNum()+num);
orderItem.setMoney(orderItem.getNum()*orderItem.getPrice());
orderItem.setPayMoney(orderItem.getNum()*orderItem.getPrice());
}else{
//不存在,新增购物车
Result<Sku> skuResult = skuFeign.findById(skuId);
Sku sku = skuResult.getData();
Spu spu = spuFeign.findByspuId(sku.getSpuId());
//将SKU转换成OrderItem
orderItem = this.sku2OrderItem(sku,spu,num);
}
//存入redis
redisTemplate.boundHashOps(CART+username).put(skuId,orderItem);//往redis中存值
}
//sku转换为orderItem
private OrderItem sku2OrderItem(Sku sku, Spu spu, Integer num) {
OrderItem orderItem = new OrderItem();
orderItem.setSpuId(sku.getSpuId());
orderItem.setSkuId(sku.getId());
orderItem.setName(sku.getName());
orderItem.setPrice(sku.getPrice());
orderItem.setNum(num);
orderItem.setMoney(num*orderItem.getPrice()); //单价*数量
orderItem.setPayMoney(num*orderItem.getPrice()); //实付金额
orderItem.setImage(sku.getImage());
orderItem.setWeight(sku.getWeight()*num); //重量=单个重量*数量
//分类ID设置
orderItem.setCategoryId1(spu.getCategory1Id());
orderItem.setCategoryId2(spu.getCategory2Id());
orderItem.setCategoryId3(spu.getCategory3Id());
return orderItem;
}
}
redisTemplate.boundHashOps(CART+username).put(skuId,orderItem);//往redis中存值
redisTemplate.boundHashOps(CART+username).get(skuId);//从redis中取值
这里注意boundHashOps这个方法在往redis中存值的时候,在hash类型中,一个key可以对应多个多个field,一个field对应一个value。将一个对象存储为hash类型的好处之一:较于每个字段都单独存储成string类型来说,更能节约内存。