分布式锁的实现方案
什么是分布式锁
当多个进程在同一个系统中,用分布式锁控制多个进程对资源的访问
分布式锁应用场景
- 传统的单体应用单机部署情况下,可以使用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 });