文章目录
使用 Redisson 加入分布式锁功能
pom.xml
1 2 3 4 5 6 7 8 9 10 |
<!-- 加入 redisson 包--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> |
注入 Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/** * 注入Bean * * @return */ @Bean public Redisson redisson() { Config config = new Config(); // 集群模式 // config.useClusterServers().addNodeAddress("redis://127.0.0.1:6379"); // 单机 模式 config.useSingleServer().setAddress("redis://127.0.0.1:6379").setDatabase(0); return (Redisson) Redisson.create(config); } |
使用 DEMO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@GetMapping(value = "/") public String index() { String lockId = "product_001"; /** * Redisson 设置分布式锁 * 业务 */ RLock redissonLock = redisson.getLock(lockId); try { redissonLock.lock(10L,TimeUnit.SECONDS); log.info("index start"); int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock")); log.info("redis 获取库存 {}", stock); if (stock > 0) { int reStock = stock - 1; stringRedisTemplate.opsForValue().set("stock", reStock + ""); log.info("库存扣减成功 库存:{}", reStock); } else { log.info("库存不足"); } } finally { redissonLock.unlock(); } return "END"; } |
Redisson 分布式锁实现原理

如果不用框架 有多麻烦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/** * redis 完善版本 分布式锁 * * String clientID = UUID.randomUUID().toString(); try { // // 设置健和值以及超时时间 // Boolean result = stringRedisTemplate.opsForValue().setIfAbsent("lockId", clientID, 10L, TimeUnit.SECONDS); if (!result) { return "没有库存了"; } if (result) { log.info("index start"); int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock")); log.info("redis 获取库存 {}", stock); if (stock > 0) { int reStock = stock - 1; stringRedisTemplate.opsForValue().set("stock", reStock + ""); log.info("库存扣减成功 库存:{}", reStock); } else { log.info("库存不足"); } } } finally { // // 锁 加入唯一 id value ,这样就不会出现 不同线程释放不同的锁了 // 比如 设置的超时时间 5s , 业务实现用了六秒 原来的锁已经过期,释放是 另外的线程锁 // if (clientId == stringRedisTemplate.opsForValue().get("lockId")) { stringRedisTemplate.delete("lockId"); } } */ |
