分布式锁的实现方案

分布式锁的实现方案

 

什么是分布式锁

当多个进程在同一个系统中,用分布式锁控制多个进程对资源的访问

分布式锁应用场景

  1. 传统的单体应用单机部署情况下,可以使用java并发处理相关的API进行互斥控制。
  2. 分布式系统后由于多线程,多进程分布在不同机器上,使单机部署情况下的并发控制锁策略失效,为了解决跨JVM互斥机制来控制共享资源的访问,这就是分布式锁的来源;分布式锁应用场景大都是高并发、大流量场景。

分布式锁实现

1、基于redis的分布式锁

redis分布式锁的实现

  1. 加锁机制:根据hash节点选择一个客户端执行lua脚本
  2. 锁互斥机制:再来一个客户端执行同样的lua脚本会提示已经存在锁,然后进入循环一直尝试加锁
  3. 可重入机制
  4. watch dog自动延期机制
  5. 释放锁机制 

 

 

测试用例

单机

 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             });
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 分布式锁的实现方案