Redisson分布式锁框架剖析1.引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.6.5</version></dependency>2.进行配置
@Beanpublic Redisson redisson() {// 此为单机模式Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);return (Redisson) Redisson.create(config);}3.业务代码展示
public String deductStock2() {String lockKey = "lock:product_101";//获取锁对象RLock redissonLock = redisson.getLock(lockKey);//加分布式锁redissonLock.lock();try {Long stock = (Long) stringRedisTemplate.opsForValue().decrement("stock");if (stock > 0) {Long realStock = stock - 1;stringRedisTemplate.opsForValue().set("stock", realStock + "");System.out.println("扣减成功 , 剩余库存:" + realStock);} else {System.out.println("扣减失败 , 库存不足");}} finally {//解锁redissonLock.unlock();}return "end";}发现说明
1.如果在集群架构下面 , 分布式锁如果在Master节点上写成功了就会返回给客户端 , 但是此时还需要同步给从节点 。
2.如果在此时间内Master节点结点宕机 , 那么数据将会消失 , 而从节点上没有锁的信息(变为Master节点) 。【主从架构锁失效问题】
4.为解决主从架构锁失效问题引入的RedLock(不建议用 , 因为本质上还是没有解决主从架构锁失效问题)
0.原理展示

文章插图
1.redssion 集群配置(在resource下创建 redssion.yml文件)
clusterServersConfig:# 连接空闲超时 , 单位:毫秒 默认10000idleConnectionTimeout: 10000pingTimeout: 1000# 同任何节点建立连接时的等待超时 。时间单位是毫秒 默认10000connectTimeout: 10000# 等待节点回复命令的时间 。该时间从命令发送成功时开始计时 。默认3000timeout: 3000# 命令失败重试次数retryAttempts: 3# 命令重试发送时间间隔 , 单位:毫秒retryInterval: 1500# 重新连接时间间隔 , 单位:毫秒reconnectionTimeout: 3000# 执行失败最大次数failedAttempts: 3# 密码password: test1234# 单个连接最大订阅数量subscriptionsPerConnection: 5clientName: null# loadBalancer 负载均衡算法类的选择loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}#从节点发布和订阅连接的最小空闲连接数slaveSubscriptionConnectionMinimumIdleSize: 1#从节点发布和订阅连接池大小 默认值50slaveSubscriptionConnectionPoolSize: 50# 从节点最小空闲连接数 默认值32slaveConnectionMinimumIdleSize: 32# 从节点连接池大小 默认64slaveConnectionPoolSize: 64# 主节点最小空闲连接数 默认32masterConnectionMinimumIdleSize: 32# 主节点连接池大小 默认64masterConnectionPoolSize: 64# 订阅操作的负载均衡模式subscriptionMode: SLAVE# 只在从服务器读取readMode: SLAVE# 集群地址nodeAddresses:- "redis://IP地址:30001"//- "redis://IP地址:30002"- "redis://IP地址:30003"- "redis://IP地址:30004"- "redis://IP地址:30005"- "redis://IP地址:30006"# 对Redis集群节点状态扫描的时间间隔 。单位是毫秒 。默认1000scanInterval: 1000#这个线程池数量被所有RTopic对象监听器 , RRemoteService调用者和RExecutorService任务共同共享 。默认2threads: 0#这个线程池数量是在一个Redisson实例内 , 被其创建的所有分布式数据类型和服务 , 以及底层客户端所一同共享的线程池里保存的线程数量 。默认2nettyThreads: 0# 编码方式 默认org.redisson.codec.JsonJacksonCodeccodec: !<org.redisson.codec.JsonJacksonCodec> {}#传输模式transportMode: NIO# 分布式锁自动过期时间 , 防止死锁 , 默认30000lockWatchdogTimeout: 30000# 通过该参数来修改是否按订阅发布消息的接收顺序出来消息 , 如果选否将对消息实行并行处理 , 该参数只适用于订阅发布消息的情况, 默认truekeepPubSubOrder: true# 用来指定高性能引擎的行为 。由于该变量值的选用与使用场景息息相关(NORMAL除外)我们建议对每个参数值都进行尝试 。
经验总结扩展阅读
- 消费贷款申请产生的费用高吗
- 11月17日北京阳光在线最高气温16℃ 明或迎降雨气温回落
- 小米手环6血氧监测准吗_小米手环6血氧监测准确度高吗
- 怎样摇骰子怎么玩点数(摇骰子的高级技巧)
- 高铁多少岁算儿童票
- 高调做事是什么意思
- 拉姆拉错海拔多少米高
- 延安有高铁站吗
- 怎样长高最快最有效 长高的有效方法是什么
- 镜字有关的成语或短语