添加Redis的POM依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
使用自动装配引入 redis的 redisTemplate这里使用的是 StringRedisTemplate,
@Autowired private StringRedisTemplate redisTemplate;
实现
//基于 Redis 实现分布式锁 public void testLock() { //加锁 Boolean lock = this.redisTemplate.opsForValue().setIfAbsent("lock", "111"); //setIfAbsent 对应 setnx,只能设置为空的key if (!lock){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } this.testLock(); }else{ //获取锁,执行业务操作 String num = this.redisTemplate.opsForValue().get("num"); if (StringUtils.isBlank(num)){ this.redisTemplate.opsForValue().set("num","1"); return; } int i = Integer.parseInt(num); this.redisTemplate.opsForValue().set("num",String.valueOf(++i)); //释放锁 this.redisTemplate.delete("lock"); } }
//循环哪里使用while也可以,稍微改一下就行
//实现不够完整,还有部分优化空间,例如防止死锁:客户端获取到锁之后,服务器立马宕机, 解决方式:给key添加过期时间(需要保证原子性)
// 原子性 加锁和过期时间: set k v ex 3 nx nx 表示key不存在时设置 xx 表示值存在时设置