问题 : 如果具体业务代码抛出异常,redis锁无法释放,产生死锁
String lockKey = "product_stock"; // 等于setnx Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"value"); if(!result){ return "error_code"; } // 具体业务 stringRedisTemplate.delete(lockKey);方式2:
问题 : 如果系统宕机无法释放锁
String lockKey = "product_stock"; // 等于setnx Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"value"); if(!result){ return "error_code"; } try{ // 具体业务 }catch (Exception e){ ... }finally{ stringRedisTemplate.delete(lockKey); }方式3:
问题 : 超时时间可能设置失败,系统宕机无法释放锁
String lockKey = "product_stock"; // 等于setnx Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"value"); // 设置超时时间 stringRedisTemplate.expire(lockKey,10,TimeUnit.SECONDS); if(!result){ return "error_code"; } try{ // 具体业务 }catch (Exception e){ ... }finally{ stringRedisTemplate.delete(lockKey); }方式4:
问题 : 指定的过期时间不足,可能会释放其他线程的锁
String lockKey = "product_stock"; // 等于setnx Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"value",10,TimeUnit.SECONDS); if(!result){ return "error_code"; } try{ // 具体业务 }catch (Exception e){ ... }finally{ stringRedisTemplate.delete(lockKey); }方式5:
问题 : 判断当前线程和删锁不是原子的,还是可能会删除其他线程的锁
String lockKey = "product_stock"; String clientId = UUID.randomUUID().toString(); // 等于setnx Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"value",10,TimeUnit.SECONDS); if(!result){ return "error_code"; } try{ // 具体业务 }catch (Exception e){ ... }finally{ if (clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){ stringRedisTemplate.delete(lockKey); } }Redisson实现分布式锁 1. 引入jar包
初始化redis客户端org.redisson redisson3.6.5
@Bean public Redisson redisson(){ // 此处为单机模式 Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379").setDarabase(0); return *(Redission) Redisson.create(config); }redisson分布式锁 *** 作
String lockKey = "product_stock"; RLock redissonLock = redisso.getLock(lockKey); try{ redissonLock.lock(); // 具体业务 }catch (Exception e){ ... }finally{ redissonLock.unlock(); }redisson加锁逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sZtn67b-1639709433758)(C:Users鲁川AppDataRoamingTyporatypora-user-imagesimage-20211126163854801.png)]
Zookeeper实现分布式锁与Redis实现分布式锁比较zookeeper性能不如redis,因为zookeeper需要同步
zookeeper不会丢key,因为zookeeper保证了数据一致性
分布式锁优化 1. 采用分段思想,将共享资源分段加锁欢迎分享,转载请注明来源:内存溢出
评论列表(0条)