Reids 分布式锁使用

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

 

posted @ 2019-11-15 10:26  馥郁  阅读(124)  评论(0编辑  收藏  举报