分布式锁中的王者方案 Redisson
网上有各种各样关于Redis实现分布式锁的方案,但何为王者方案?
答案就: Redisson。
我们先来看下 Redis 官网对分布式锁的说法:
而 Java 版的 分布式锁的框架就是 Redisson。
本篇实战内容将会基于我的开源项目 PassJava 来整合 Redisson。
我把后端
、前端
、小程序
都上传到同一个仓库里面了,大家可以通过 Github
或 码云
访问。地址如下:
Github: https://github.com/Jackson0714/PassJava-Platform
码云:https://gitee.com/jayh2018/PassJava-Platform
配套教程:www.passjava.cn
在实战之前,我们先来看下使用 Redisson 的原理。
一、Redisson 是什么?
如果你之前是在用 Redis 的话,那使用 Redisson 的话将会事半功倍,Redisson 提供了使用 Redis的最简单和最便捷的方法。
Redisson的宗旨是促进使用者对 Redis 的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid)。
Netty 框架:Redisson采用了基于NIO的Netty框架,不仅能作为Redis底层驱动客户端,具备提供对Redis各种组态形式的连接功能,对Redis命令能以同步发送、异步形式发送、异步流形式发送或管道形式发送的功能,LUA脚本执行处理,以及处理返回结果的功能
基础数据结构:将原生的Redis
Hash
,List
,Set
,String
,Geo
,HyperLogLog
等数据结构封装为Java里大家最熟悉的映射(Map)
,列表(List)
,集(Set)
,通用对象桶(Object Bucket)
,地理空间对象桶(Geospatial Bucket)
,基数估计算法(HyperLogLog)
等结构,分布式数据结构:这基础上还提供了分布式的多值映射(Multimap),本地缓存映射(LocalCachedMap),有序集(SortedSet),计分排序集(ScoredSortedSet),字典排序集(LexSortedSet),列队(Queue),阻塞队列(Blocking Queue),有界阻塞列队(Bounded Blocking Queue),双端队列(Deque),阻塞双端列队(Blocking Deque),阻塞公平列队(Blocking Fair Queue),延迟列队(Delayed Queue),布隆过滤器(Bloom Filter),原子整长形(AtomicLong),原子双精度浮点数(AtomicDouble),BitSet等Redis原本没有的分布式数据结构。
分布式锁:Redisson还实现了Redis文档中提到像分布式锁
Lock
这样的更高阶应用场景。事实上Redisson并没有不止步于此,在分布式锁的基础上还提供了联锁(MultiLock)
,读写锁(ReadWriteLock)
,公平锁(Fair Lock)
,红锁(RedLock)
,信号量(Semaphore)
,可过期性信号量(PermitExpirableSemaphore)
和闭锁(CountDownLatch)
这些实际当中对多线程高并发应用至关重要的基本部件。正是通过实现基于Redis的高阶应用方案,使Redisson成为构建分布式系统的重要工具。节点:Redisson作为独立节点可以用于独立执行其他节点发布到
分布式执行服务
和分布式调度服务
里的远程任务。- 文件方式配置。
- (2)如果抢占到锁的线程所在的服务停了,锁会不会被释放?
- 第二步:线程 B 在 0.1 秒尝试抢占锁,未能抢到锁(被 A 抢占了)。
- 第三步:线程 A 在 10.1 秒后,释放锁。
- 第四步:线程 B 在 10.1 秒后抢占到锁,然后等待 10 秒后释放锁。
- 读锁 + 写锁:写锁需要等待读锁释放锁。
- 写锁 + 写锁:互斥,需要等待对方的锁释放。
- 写锁 + 读锁:读锁需要等待写锁释放。
联锁(MultiLock)
红锁(RedLock)
读写锁(ReadWriteLock)
可过期性信号量(PermitExpirableSemaphore)
闭锁(CountDownLatch)