<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 表示值存在时设置
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。