分布式锁的实现方案
什么是分布式锁
当多个进程在同一个系统中,用分布式锁控制多个进程对资源的访问
分布式锁应用场景
- 传统的单体应用单机部署情况下,可以使用java并发处理相关的API进行互斥控制。
- 分布式系统后由于多线程,多进程分布在不同机器上,使单机部署情况下的并发控制锁策略失效,为了解决跨JVM互斥机制来控制共享资源的访问,这就是分布式锁的来源;分布式锁应用场景大都是高并发、大流量场景。
分布式锁实现
1、基于redis的分布式锁
redis分布式锁的实现
- 加锁机制:根据hash节点选择一个客户端执行lua脚本
- 锁互斥机制:再来一个客户端执行同样的lua脚本会提示已经存在锁,然后进入循环一直尝试加锁
- 可重入机制
- watch dog自动延期机制
- 释放锁机制
测试用例
单机
1 private RedissonClient getClient(){
2 Config config = new Config();
3 config.useSingleServer().setAddress("redis://127.0.0.1:6379");//.setPassword("");//.setConnectionMinimumIdleSize(10).setConnectionPoolSize(10);//.setConnectionPoolSize();//172.16.10.164
4 RedissonClient redissonClient = Redisson.create(config);
5 return redissonClient;
6 }
7 private ExecutorService executorService = Executors.newCachedThreadPool();
8 ----------------------------------------------------------------
9 int[] count = {0};
10 for (int i = 0; i < 10; i++) {
11 RedissonClient client = getClient();
12 final RedisLock redisLock = new RedisLock(client,"lock_key");
13 executorService.submit(() -> {
14 try {
15 redisLock.lock();
16 count[0]++;
17 } catch (Exception e) {
18 e.printStackTrace();
19 } finally {
20 try {
21 redisLock.unlock();
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 }
26 });



