191126项目进度B

redis分布式锁的实现,item功能的完善

###加注释环节

public PmsSkuInfo item(String skuId) {     
        PmsSkuInfo pmsSkuInfo = null;
        // 先查询缓存
        Jedis jedis = null;
        try {
            jedis = redisUtil.getJedis();
            // key=object:id:field ,sku:id:info
            String skuJSON = jedis.get("sku:" + skuId + ":info");

            if (StringUtils.isNotBlank(skuJSON)) {
                pmsSkuInfo = JSON.parseObject(skuJSON, PmsSkuInfo.class);         
            } else {
                // 如果缓存不存在
                // 先领号
                String lock = "sku:"+skuId+":lock";
                String uuid = UUID.randomUUID().toString();
                String OK = jedis.set(lock, uuid, "nx", "px", 10000);
                if(StringUtils.isNotBlank(OK)&&OK.equals("OK")){
                    pmsSkuInfo = itemFromDb(skuId);
                    // 存入缓存
                    if (pmsSkuInfo != null) {
                        //Thread.sleep(4000);
                        jedis.set("sku:" + skuId + ":info", JSON.toJSONString(pmsSkuInfo));
                        // 防止误删其他线程的锁
						//String lockValue = jedis.get(lock);
						//if(StringUtils.isNotBlank(lockValue)&&uuid.equals(lockValue)){
						//jedis.del("sku:"+skuId+":lock");
						// }
                        String script ="if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1])        else return 0 end";
                        jedis.eval(script, Collections.singletonList(lock),Collections.singletonList(uuid));
                }else{
                    // 自旋
                    //Thread.sleep(3000);
                    return item(skuId,ip);
                }
            }
        }catch (Exception e){
            //logService.errLog(e,new Date(),skuId);
        }finally {
            jedis.close();
        }
        return pmsSkuInfo;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值