我愛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類型來說,更能節約內存。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM