利用Redisson实现分布式锁是一个不错的解决方案
Redisson是Redis的一个框架
她对Redis扩展了一些功能,其中一个就是锁
她的包
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.10.6</version> </dependency>
使用Config类配置redis的连接信息
Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379");
创建RedissonClient客户端
RedissonClient redisson = Redisson.create(config);
通过getLock()方法获取一个锁
参数传锁的名字
RLock lock = redisson.getLock("lock-test");
用lock()方法开启锁
第一个参数是锁的时间,第二个参数是对时间的描述,是秒、分钟、小时或者天
她会在redis服务中创建一条key为lock-test的数据
这条数据直到锁的时间结束,或者关闭锁,才会消失
lock.lock(20, TimeUnit.SECONDS);
用unlock()方法关闭锁
lock.unlock();
完整例子
public static void main(String[] args) throws InterruptedException { Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); RedissonClient redisson = Redisson.create(config); RLock lock = redisson.getLock("lock-test"); while (true){ lock.lock(20, TimeUnit.SECONDS); System.out.println(new Date()); Thread.sleep(1000); lock.unlock(); } }
然后开两个项目测试一下
可以看到没有重复的时间
------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是一个简单的例子,但是在实际开发中可不能这么写
可以将其封装一下,提供注解,在一个代理中执行,会更妙!