//1.连接缓存
Jedis jedis = JedisUtil.getJedis();
//2.查询缓存,有直接返回
String redisValue = jedis.get(key);
//3.缓存没有,设置分布式锁
String token = UUID.randomUUID().toString();
Strig OK = redis.set("Key100Lock",token,"nx","px",10);//nx 只当键不存在时,才进行设置,px设置10毫秒过期
if(StringUtils.isNotBlank(OK)){//设置成功后
MessageVo dbResult = getDB();//查询数据库
if(dbResult!=nul){
jedis.set("key100Info",JSON.toJSONString(MessageVo))//查询到数据写入到缓存中
}else{
jedis.setex("key100Info",60,"");//查询不到,防止缓存穿透,将空字符串设置给redis
}
String LockToken = jedis.get(“Key100Lock”);
if(StringUtils.isNotBlank(LockToken)&&LockToken.equals(token)){
//jedis.eval("lua"); 也可以用lua脚本,在查询到key同时,删除该key,防止高并发情况下意外发生
redis.del("Key100Lock");//用token确认删除的是自己的锁
}
}
else{//4.设置分布式锁失败,休眠几秒,尝试重新访问本方法
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
log.error(e.getMessage());
}
return getRedi(skuId);
}