赞
踩
除redis相关包外额外引入下面的包:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.1</version>
</dependency>
版本对应关系:
按上图说明,如果是springboot 2.1.X 应该如下引入
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.13.1</version> <exclusions> <exclusion> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-22</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.redisson</groupId> <!-- for Spring Data Redis v.2.1.x --> <artifactId>redisson-spring-data-21</artifactId> <version>3.13.1</version> </dependency>
@Service @Slf4j public class DemoService { @Autowired private RedissonClient redissonClient; public void redissonTest(){ //创建锁 RLock helloLock = redissonClient.getLock("hello"); log.info(" start lock time:"+System.currentTimeMillis()); try { //20s拿不到锁,返回false; 拿到锁最多持有8s boolean res = helloLock.tryLock(20,8, TimeUnit.SECONDS); if ( res){ log.info("locked time:"+System.currentTimeMillis()); }else{ System.out.println("系统繁忙"); } }catch (Exception e){ e.printStackTrace(); //实际业务中用到事务的需要手动处理 // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } finally { //释放锁 log.info("------finished-------"); helloLock.unlock(); } } }
Redis分布式锁的缺点
如果对某个redis master实例,写入了myLock这种锁key的value,此时会异步复制给对应的master slave实例。
但是这个过程中一旦发生redis master宕机,主备切换,redis slave变为了redis master。
接着就会导致,客户端2来尝试加锁的时候,在新的redis master上完成了加锁,而客户端1也以为自己成功加了锁。
此时就会导致多个客户端对一个分布式锁完成了加锁。
这时系统在业务语义上一定会出现问题,导致各种脏数据的产生。
所以这个就是redis cluster,或者是redis master-slave架构的主从异步复制导致的redis分布式锁的最大缺陷:在redis master实例宕机的时候,可能导致多个客户端同时完成加锁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。