分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。
分布式锁应该具备哪些条件
分布式锁应具备哪些条件呢?
1 | 1、在分布式系统环境下,目标资源只能被一个消费者使用,即一个方法在同一时间只能被一个机器的一个线程执行; |
Redis分布式锁的实现方法
第一种分布式锁
获取锁的命令:
1 | SET key value ex seconds nx |
加锁的同时设置过期时间。
第二种Redisson 实现
Redisson 顾名思义,Redis 的儿子,本质上还是 Redis 加锁,不过是对 Redis 做了很多封装,它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务。
引入依赖:
1 | <dependency> |
使用方法:
1 | private void test() { |
使用方法 jdk 的 ReentrantLock 差不多,并且也支持 ReadWriteLock(读写锁)、Reentrant Lock(可重入锁)、Fair Lock(公平锁)、RedLock(红锁)等各种锁,详细可以参照redisson官方文档来查看。
那么 Redisson 到底有哪些优势呢?锁的自动续期(默认都是 30 秒),如果业务超长,运行期间会自动给锁续上新的 30s,不用担心业务执行时间超长而锁被自动删掉。加锁的业务只要运行完成,就不会给当前续期,即便不手动解锁,锁默认在 30s 后删除,不会造成死锁问题。
也可以自定义自动续期的时间:
1 | lock.lock(10, TimeUnit.SECONDS); |
一般开发中推荐使用虽然 lock() 有自动续锁机制,但是开发中还是推荐使用 lock(time,timeUnit),因为它省掉了整个续期带来的性能损,可以设置过期时间长一点,搭配 unlock()。如果业务流程执行完成,会手动释放锁,若是业务执行超时报错了,报错后就会通过设置的过期时间来释放锁。
缺点:
1 | 在这种场景(主从结构)中存在明显的竞态: |