在分布式系统中,使用锁也是很麻烦的事情,而且非常影响性能,对应原子性操作,就需要使用的分布式锁。下面学习一下springboot中集成的redis分布式锁的使用。
引入maven依赖
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
- <dependency>
- <groupId>org.redissongroupId>
- <artifactId>redisson-spring-data-25artifactId>
- <version>3.16.4version>
- dependency>
- <dependency>
- <groupId>org.redissongroupId>
- <artifactId>redisson-spring-boot-starterartifactId>
- <version>3.16.4version>
- dependency>
代码实现样例:
- @RestController
- @Slf4j
- public class RedisController {
- // spring boot 操作redis的模板方法类
- @Autowired
- private StringRedisTemplate redisTemplate;
-
- // redisson操作bean
- @Resource
- private Redisson redisson;
- @RequestMapping("/lock")
- public String deductTicket(){
- String lockKey = "ticket";
-
- // 在spring boot 2.0.6版本中整合的redisson,key和锁不能一样
- // redis setnx 操作,此处的lockKey在后面追加1是为了避免redisson锁时报错, 需要和待锁住的数据的key信息不同
- RLock lock = redisson.getLock(lockKey+"1");
- try {
- lock.lock();
- int ticketCount = Integer.parseInt(redisTemplate.opsForValue().get(lockKey));
- if (ticketCount > 0) {
- int realTicketCount = ticketCount - 1;
- log.info("扣除成功:剩余票数:" + realTicketCount);
- redisTemplate.opsForValue().set(lockKey, realTicketCount + "");
- return realTicketCount + "";
- } else {
- log.error("扣除失败");
- return "error";
- }
- return "end";
- } finally {
- lock.unlock();
- }
- }
- }
核心代码:
获取锁资源
lock.lock();
释放锁资源:
lock.unlock();
Redis是一个基于内存的高性能Key-Value数据库,其原理和使用如下:
Redis提供了多种机制来处理高并发情况,以下是几种常见的方法: