zoukankan      html  css  js  c++  java
  • 我爱java系列---【redis中如何存取hash类型的值(key field value)】

    @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类型来说,更能节约内存。
     
    愿你走出半生,归来仍是少年!
  • 相关阅读:
    JAVAWE第一天
    01--2048实例开篇
    10--动作系统(四)动作类中的reverse方法
    09--动作系统(三)使用持续动作
    08--动作系统(二)使用即时动作
    【转】cocos2d-x windows开发环境配置
    07--动作系统(一)
    06--触摸事件响应
    05--简单场景切换与精灵创建
    04--简单菜单使用
  • 原文地址:https://www.cnblogs.com/hujunwei/p/11440507.html
Copyright © 2011-2022 走看看