# open-redisson-lock **Repository Path**: MyCodeStudio/open-lock ## Basic Information - **Project Name**: open-redisson-lock - **Description**: 基于Redisson的分布式幂等、分布式锁轻量级框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 5 - **Created**: 2022-05-24 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![](https://images.gitee.com/uploads/images/2021/0312/210806_3b18b1e2_4787103.png) #### 升级日志 **2021-01-06** 1. 发布 1.0.0.RELEASE 版本 --- #### 使用教程 1. 引入 pom.xml ```xml com.open cloud-lock 1.0.0.RELEASE ``` 2. 在`application.properties`增加`redisson`配置 ##### 单例模式 ``` redisson.model=SINGLE redisson.password=root redisson.clientName= redisson.single.address=127.0.0.1:6379 ``` ##### 集群模式 >集群模式除了适用于Redis集群环境,也适用于任何云计算服务商提供的集群模式 ``` redisson.model=CLUSTER redisson.password=root redisson.clientName= redisson.multiple.node[0]=127.0.0.1:6379 redisson.multiple.node[1]=127.0.0.1:6389 redisson.multiple.node[2]=127.0.0.1:6399 ``` ##### 云托管模式 >云托管模式适用于任何由云计算运营商提供的Redis云服务 ``` redisson.model=REPLICATED redisson.password=root redisson.clientName= redisson.multiple.node[0]=127.0.0.1:6379 redisson.multiple.node[1]=127.0.0.1:6389 redisson.multiple.node[2]=127.0.0.1:6399 ``` ##### 哨兵模式 ``` redisson.model=SENTINEL redisson.password=root redisson.clientName= redisson.multiple.master-name="mymaster" redisson.multiple.node[0]=127.0.0.1:6379 redisson.multiple.node[1]=127.0.0.1:6389 redisson.multiple.node[2]=127.0.0.1:6399 ``` ##### 主从模式 ``` redisson.model=MASTERSLAVE #第一台机器就是主库.其他的为从库 redisson.multiple.node[0]=127.0.0.1:6379 redisson.multiple.node[1]=127.0.0.1:6389 redisson.multiple.node[2]=127.0.0.1:6399 ``` --- #### 使用说明 >1.如何使用`分布式锁`? ``` @Autowired private CloudLock lock; @GetMapping("lockTimeout") public RestResponse lockTimeout(@RequestParam("name") String name) { RLock rLock = lock.tryLock(LockModel.REENTRANT, 0L, 10000L,"123"); try { System.out.println("start:" + name); Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } finally { //lock.unlock(rLock); } System.out.println(name); return RestResponse.success(); } ``` >2.如何使用`分布式锁幂等性注解`? ``` @Idempotent(key = "#result.msgId+':'+#result.appId",expire = 10000) @PostMapping("idempotent") public RestResponse idempotent(@RequestBody RemoteNotifyBO result) { System.out.println(result.getMsgId() + result.getAppId()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return RestResponse.success(result.getMsgId() + result.getAppId()); } ``` >3.如何使用``redisson` 客户端实现自定义操作`? ``` //只需要在spring 容器中注入redisson客户端就行,如下: @Autowired private RedissonClient redissonClient; ``` --- #### 属性列表 > 1.公共参数 | 属性名 | 默认值 | 备注 | | :---- | :---- | :---- | | redisson.model | SINGLE | 集群模式:SINGLE(单例),SENTINEL(哨兵),MASTERSLAVE(主从),CLUSTER(集群),REPLICATED(云托管) | | redisson.codec | org.redisson.codec.JsonJacksonCodec | Redisson的对象编码类是用于将对象进行序列化和反序列化 | | redisson.lockWatchdogTimeout | 30000 | 监控锁的看门狗超时时间单位为毫秒。该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时,那么这个锁将变为失效状态。这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况 | | redisson.password | 无 | 用于节点身份验证的密码 | | redisson.clientName | 无 | 在Redis节点里显示的客户端名称 | | redisson.connectTimeout | 10000 | 同任何节点建立连接时的等待超时。时间单位是毫秒。 | | redisson.timeout | 3000 | 等待节点回复命令的时间。该时间从命令发送成功时开始计时。 | | redisson.lockModel | 单个key默认`可重入锁`多个key默认`红锁` | 锁的模式.如果不设置, REENTRANT(可重入锁),FAIR(公平锁),MULTIPLE(联锁),REDLOCK(红锁),READ(读锁), WRITE(写锁) | | redisson.attemptTimeout | 10000L | 等待获取锁超时时间,-1则是一直等待 单位毫秒 | | redisson.dataValidTime | 1000\*60\* 30L | 数据缓存时间 默认30分钟 -1永久缓存 | >2. 单例模式参数 | 属性名 | 默认值 | 备注 | | :---- | :---- | :---- | | redisson.single.address | 无 | 服务器地址,必填ip:port | | redisson.single.database | 0 | 尝试连接的数据库编号 | | redisson.single.connectionPoolSize | 64 | 等待节点回复命令的时间。该时间从命令发送成功时开始计时。 | | redisson.single.connectionMinimumIdleSize | 32 | 等待节点回复命令的时间。该时间从命令发送成功时开始计时。 | >3. 集群模式 | 属性名 | 默认值 | 备注 | | :---- | :---- | :---- | | redisson.multiple.scanInterval | 1000 | (集群,哨兵,云托管模特特有) 对Redis集群节点状态扫描的时间间隔。单位是毫秒。 | | redisson.multiple.readMode | SLAVE | 设置读取操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。 | | redisson.multiple.loadBalancer | org.redisson.connection.balancer.RoundRobinLoadBalancer | 负载均衡算法类的选择 默认值:轮询调度算法,可选(WeightedRoundRobinBalancer)权重轮询调度算法,(RandomLoadBalancer)随机调度算法 | | redisson.multiple.node | 无 | 服务器节点地址.必填 | | redisson.multiple.database | 0 | (哨兵模式,云托管,主从模式特有)尝试连接的数据库编号。 | | redisson.multiple.masterName | 无 | (哨兵模式特有)主服务器的名称是哨兵进程中用来监测主从服务切换情况的。 | | redisson.multiple.slaveConnectionMinimumIdleSize | 32 | 多从节点的环境里,每个从服务节点里用于普通操作(非 发布和订阅)的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时读取反映速度。 | | redisson.multiple.slaveConnectionPoolSize | 64 | 多从节点的环境里,每个从服务节点里用于普通操作(非 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。 | | redisson.multiple.masterConnectionMinimumIdleSize | 32 | 多节点的环境里,每个主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。 | | redisson.multiple.masterConnectionPoolSize | 64 | 多主节点的环境里,每个主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。 |