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;
}