Java最全如何优雅的实现分布式锁,层层深入

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

| — | — |

| lock() | Acquires the lock. 加锁,如果已经被其他线程锁住或者当前线程不能获取锁则阻塞 |

| lockInterruptibly() | Acquires the lock unless the current thread is interrupted. 加锁,除非当前线程被打断。 |

| tryLock() | Acquires the lock only if it is free at the time of invocation. 尝试加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true |

| tryLock(long time, TimeUnit unit) | Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted. 尝试在指定时间内加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true |

| unlock() | Releases the lock. 解锁 |

实战


话不多说,我们看看使用 Spring Integration 如何基于redis和zookeeper快速实现分布式锁,至于Gemfire 和 Jdbc的实现大家自行实践。

基于Redis实现

  • 引入相关组件

org.springframework.boot

spring-boot-starter-integration

org.springframework.integration

spring-integration-redis

org.springframework.boot

spring-boot-starter-data-redis

  • 在application.yml中添加redis的配置

spring:

redis:

host: 172.31.0.149

port: 7111

  • 建立配置类,注入RedisLockRegistry

@Configuration

public class RedisLockConfiguration {

@Bean

public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory){

return new RedisLockRegistry(redisConnectionFactory, “redis-lock”);

}

}

  • 编写测试代码

@RestController

@RequestMapping(“lock”)

@Log4j2

public class DistributedLockController {

@Autowired

private RedisLockRegistry redisLockRegistry;

@GetMapping(“/redis”)

public void test1() {

Lock lock = redisLockRegistry.obtain(“redis”);

try{

//尝试在指定时间内加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true

if(lock.tryLock(3, TimeUnit.SECONDS)){

log.info(“lock is ready”);

TimeUnit.SECONDS.sleep(5);

}

} catch (InterruptedException e) {

log.error(“obtain lock error”,e);

} finally {

lock.unlock();

}

}

}

  • 测试

启动多个实例,分别访问 /lock/redis 端点,一个正常秩序业务逻辑,另外一个实例访问出现如下错误

image.png

说明第二个实例没有拿到锁,证明了分布式锁的存在。

注意,如果使用新版Springboot进行集成时需要使用Redis4版本,否则会出现下面的异常告警,主要是unlock() 释放锁时使用了UNLINK命令,这个需要Redis4版本才能支持。

2020-05-14 11:30:24,781 WARN RedisLockRegistry:339 - The UNLINK command has failed (not supported on the Redis server?); falling back to the regular DELETE command

org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR unknown command ‘UNLINK’

基于Zookeeper实现

  • 引入组件

org.springframework.boot

spring-boot-starter-integration

org.springframework.integration

spring-integration-zookeeper

  • 在application.yml中添加zookeeper的配置

zookeeper:

host: 172.31.0.43:2181

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

片转存中…(img-Q1JPAn8D-1715344308305)]

[外链图片转存中…(img-b5xLbioj-1715344308305)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中使用Redlock实现分布式锁可以通过以下步骤进行: 1. 引入Redlock的依赖:首先需要引入相应的依赖,例如使用Redisson框架来实现Redlock,可以添加以下Maven依赖: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.15.5</version> </dependency> ``` 2. 创建Redisson客户端:使用Redisson提供的`RedissonClient`来连接Redis集群或者单个Redis实例。需要根据实际情况配置连接参数,例如连接地址、密码等。 ```java Config config = new Config(); config.useClusterServers() .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380", "redis://127.0.0.1:6381") .setPassword("your_password"); RedissonClient redisson = Redisson.create(config); ``` 3. 创建Redlock实例:使用Redisson提供的`RLock`接口来实现Redlock锁。可以通过`getLock()`方法创建一个实例。 ```java RLock lock = redisson.getLock("myLock"); ``` 4. 使用Redlock锁:在需要加锁的代码段中,使用`lock()`方法获取锁,然后执行业务逻辑,最后使用`unlock()`方法释放锁。 ```java lock.lock(); try { // 执行业务逻辑 } finally { lock.unlock(); } ``` 完整示例代码如下: ```java import org.redisson.Redisson; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class RedlockExample { public static void main(String[] args) { // 创建Redisson客户端 Config config = new Config(); config.useClusterServers() .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380", "redis://127.0.0.1:6381") .setPassword("your_password"); RedissonClient redisson = Redisson.create(config); // 创建Redlock实例 RLock lock = redisson.getLock("myLock"); // 使用Redlock锁 lock.lock(); try { // 执行业务逻辑 System.out.println("Acquired lock, executing business logic..."); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println("Released lock."); } // 关闭Redisson客户端 redisson.shutdown(); } } ``` 需要注意的是,Redlock是一种实现分布式锁的算法,并不是Redis的内置特性。在使用Redlock时,需要确保Redis集群中的节点正常运行,并且网络连接稳定。此外,Redlock并不适用于所有的分布式场景,对于一些对强一致性要求很高的场景,可能需要使用更加复杂的分布式锁方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值