分布式锁RedLock的java实现Redisson

1. 概述
在这里插入图片描述Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

关于Redisson项目的详细介绍可以在官方网站找到。

每个Redis服务实例都能管理多达1TB的内存。

能够完美的在云计算环境里使用,并且支持AWS ElastiCache主备版,AWS ElastiCache集群版,Azure Redis Cache和阿里云(Aliyun)的云数据库Redis版

以下是Redisson的结构:

Redisson作为独立节点 可以用于独立执行其他节点发布到分布式执行服务 和 分布式调度任务服务 里的远程任务。
在这里插入图片描述
如果你现在正在使用其他的Redis的Java客户端,那么Redis命令和Redisson对象匹配列表 能够帮助你轻松的将现有代码迁徙到Redisson框架里来。
Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。
欢迎试用高性能Redisson PRO版。

2.使用Redisson
2.1引入Maven依赖

<!-- JDK 1.8+ compatible -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.5.4</version>
</dependency>  <!-- JDK 1.6+ compatible -->
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.10.4</version>
</dependency>

注意一下几点:
1:文档里面说明了支持Redis 2.8以上版本,支持Java1.6+以上版本。根据自己的环境选择合适的版本!
2:2.8.1的redisson 需要使用 netty的jar包, 否则报错:Hopper: java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup。
3:2.8.1的redisson需要jackson 2.5+版本,否则报错bjectMapper.addMixIn method not fond。

2.2配置
Redisson配置文档
本文以哨兵模式为例分别给出 json yml xml

{"sentinelServersConfig":{"idleConnectionTimeout":10000,"connectTimeout":10000,"timeout":3000,"retryAttempts":3,"retryInterval":1500,"failedSlaveReconnectionInterval":3000,"failedSlaveCheckInterval":60000,"password":null,"subscriptionsPerConnection":5,"clientName":null,"loadBalancer":{"class":"org.redisson.connection.balancer.RoundRobinLoadBalancer"},"subscriptionConnectionMinimumIdleSize":1,"subscriptionConnectionPoolSize":50,"slaveConnectionMinimumIdleSize":32,"slaveConnectionPoolSize":64,"masterConnectionMinimumIdleSize":32,"masterConnectionPoolSize":64,"readMode":"SLAVE","subscriptionMode":"SLAVE","sentinelAddresses":["redis://127.0.0.1:26379","redis://127.0.0.1:26389"],"masterName":"mymaster","database":0},"threads":0,"nettyThreads":0,"codec":{"class":"org.redisson.codec.FstCodec"},"transportMode":"NIO"
}sentinelServersConfig:idleConnectionTimeout: 10000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500failedSlaveReconnectionInterval: 3000failedSlaveCheckInterval: 60000password: nullsubscriptionsPerConnection: 5clientName: nullloadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50slaveConnectionMinimumIdleSize: 32slaveConnectionPoolSize: 64masterConnectionMinimumIdleSize: 32masterConnectionPoolSize: 64readMode: "SLAVE"subscriptionMode: "SLAVE"sentinelAddresses:- "redis://127.0.0.1:26379"- "redis://127.0.0.1:26389"masterName: "mymaster"database: 0
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.FstCodec> {}
transportMode: "NIO"<redisson:clientid="redisson"name="redisson1,redisson2"threads="0"netty-threads="0"codec-ref="myCodec" transport-mode="NIO"reference-enabled="true"reference-codec-provider-ref="myCodecProvider"executor-ref="myExecutor"event-loop-group-ref="myEventLoopGroup"
><!--You can't have both name attribute and qualifier element atthe same time. Both id attribute and name attribute can be used as qualifiercandidates.--><!--<qualifier value="redisson3"/>--><redisson:sentinel-serversidle-connection-timeout="10000"ping-timeout="1000"connect-timeout="10000"timeout="3000"retry-attempts="3"retry-interval="1500"reconnection-timeout="3000"failed-attempts="3"password="do_not_use_if_it_is_not_set"subscriptions-per-connection="5"client-name="none"load-balancer-ref="myLoadBalancer"subscription-connection-minimum-idle-size="1"subscription-connection-pool-size="50"slave-connection-minimum-idle-size="10"slave-connection-pool-size="64"master-connection-minimum-idle-size="10"master-connection-pool-size="64"read-mode="SLAVE"subscription-mode="SLAVE"master-name="myMaster"database="0"><redisson:sentinel-address value="redis://127.0.0.1:26379" /><redisson:sentinel-address value="redis://127.0.0.1:26380" /></redisson:sentinel-servers>
</redisson:client><!-- minimal settings -->
<redisson:client><redisson:sentinel-servers master-name="myMaster"><redisson:sentinel-address value="redis://127.0.0.1:26379" /><redisson:sentinel-address value="redis://127.0.0.1:26380" />....</redisson:sentinel-servers>
</redisson:client>

2.3举个栗子

 Config config = new Config();config.useSentinelServers().setMasterName("dongshuo").addSentinelAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);RLock lock = redissonClient.getLock("dongshuo");lock.lock(1000, TimeUnit.SECONDS);try {System.out.println("获取到Redisson锁");}finally {lock.unlock();}redissonClient.shutdown();
  •  

2.4监控Redis命令

127.0.0.1:6379> monitor
OK
1434959509.494805 [0 127.0.0.1:57911] "SETNX" "dongshuo" "{\"@class\":\"org.redisson.RedissonLock$LockValue\",\"counter\":1,\"id\":\"c374addc-523f-4943-b6e0-c26f7ab061e3\",\"threadId\":1}"
1434959509.494805 [0 127.0.0.1:57911] "GET" "dongshuo"
1434959509.524805 [0 127.0.0.1:57911] "MULTI"
1434959509.529805 [0 127.0.0.1:57911] "DEL" "dongshuo"
1434959509.529805 [0 127.0.0.1:57911] "PUBLISH" "redisson__lock__channel__{dongshuo}" "0"
1434959509.529805 [0 127.0.0.1:57911] "EXEC"
  •  

看起来还是用到了sentnx命令\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我三年开发经验,从字节跳动抖音离职后,看看这篇文章吧!

最新BAT大厂面试者整理的Android面试题目&#xff01; 近期根据网友分享大厂面试题目&#xff0c;今天我将网友面试的BAT等大厂Android面试题目整理出来&#xff0c;希望能够帮助大家&#xff01; 珍藏版&#xff08;1&#xff09;——高级 UI 晋升 第一节、触摸事件分发机制…

arthas命令redefine实现Java热更新

Arthas非常重要的命令redefine&#xff0c;主要作用是加载外部的.class文件&#xff0c;用来替换JVM已经加载的类&#xff0c;总结起来就是实现了Java的热更新。 redefine在一下几种情况中会失败&#xff1a;1、增加了field&#xff1b;2、增加了method&#xff1b;3、替换正在…

安装 ZendServer-CE 可能遇到的问题

安装后,打开http://localhost:10081/ZendServer 出现如下页面. Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, adminexample.com and inform them…

Elk7.2 Docker

正如官方所说的那样 https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html&#xff0c;Elasticsearch默认使用mmapfs目录来存储索引。操作系统默认的mmap计数太低可能导致内存不足&#xff0c;我们可以使用下面这条命令来增加内存 为了防止…

我了解到的面试的一些小内幕!附面试题答案

背景 首先我是个菜鸡&#xff0c;工资也低的一笔。 刚毕业时候在一家国企上班干 app 开发&#xff0c;干了快两年的时候&#xff0c;跳槽到了一家伪大厂干安全。投了不少简历都没有回音&#xff0c;只有这加伪大厂要我就来了。当时说好了会接触一些底层的东西&#xff0c;然而…

学习单调队列小结

因为一直在听身边的人说什么单调队列/斜率优化dp/背包&#xff0c;(ps:我也不清楚这样称呼对不对&#xff0c;因为我真心是没见过这些东西)我都觉得那是神一样的东西。终于抽出时间学了一下。 昨天在朋友一本书里面看到一句话&#xff0c;这里先跟大家分享一下&#xff1a; 没有…

@Async join

直接贴代码 自定义线程池 package com.xh.lawsuit.rest.modular.example; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecu…

我们究竟还要学习哪些Android知识?完整版开放下载

前言 移动研发火热不停&#xff0c;越来越多人开始学习 android 开发。但很多人感觉入门容易成长很难&#xff0c;对未来比较迷茫&#xff0c;不知道自己技能该怎么提升&#xff0c;到达下一阶段需要补充哪些内容。市面上也多是谈论知识图谱&#xff0c;缺少体系和成长节奏感&a…

ELK7.8.1的Docker搭建过程

在linux下首先在目录准备文件 首先说明&#xff0c;我的电脑宿主机的IP是192.168.1.5 为es准备文件 mkdir -p /opt/elk7/es cd /opt/elk7/es #创建对应的文件夹 数据 / 日志 / 配置 mkdir conf data logs #授权 chmod 777 -R conf data logs然后进入到/opt/elk7/es/conf下 …

如何使用git创建项目,创建分支

git config -global user.name "Your name" git config -global user.email "youexample.com" 建立一个存放工程的文件夹 git init命令用于初始化当前所在目录的这个项目 会创建一个隐藏文件 .git 创建 main.c 文件 创建 .gitignore文件&#xff0c;忽略…

我们究竟还要学习哪些Android知识?附赠课程+题库

2021新的一年&#xff0c;开启新的征程&#xff0c;回顾2020&#xff0c;真是太“南”了。 从年初各大厂裁员&#xff0c;竟然成为一件理所应当的事情&#xff0c;到四月份 GitHub 上“996.ICU” 引起了大家的共鸣。即使我们兢兢业业“996”&#xff0c;但依旧难以抵御 35 岁时…

WINDOWS上KAFKA运行环境安装

WINDOWS上KAFKA运行环境安装 1. 安装JDK 1.1 安装文件&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK 1.2 安装完成后需要添加以下的环境变量&#xff08;右键点击“我的电脑” -> "高级系统设置" -> "环境变…

架构师成长之路-个人学习经验分享(公司研发峰会演讲ppt)

前天在公司分享了一些学习经验,园子中感兴趣可以看看。建议大家使用pptPlex来看这个片子。 首先从我在成长中不同阶段的工作和体会来谈不同阶段的学习内容谈起&#xff0c;为了做好这些必修课&#xff0c;我会对知识&#xff0b;实践&#xff0b;思考&#xff0b;心态&#xff…

我凭什么拿到了阿里、腾讯、今日头条3家大厂offer?这原因我服了

前言 从毕业到现在面试也就那么几家公司&#xff0c;单前几次都比较顺利&#xff0c;在面到第三家时都给到了我offer&#xff01;前面两次找工作&#xff0c;没考虑到以后需要什么&#xff0c;自己的对未来的规划是什么&#xff0c;只要有份工作&#xff0c;工资符合自己的要求…

kafka logstash elk

前言 企业开发中&#xff0c;一个应用会有多个测试环境&#xff0c;于是会有一个专门的服务器做日志收集&#xff0c;那就需要保存日志和应用隔离&#xff0c;这里就牵涉到异步存写日志的问题&#xff0c;异步消息队列选取kafka&#xff0c;高性能&#xff0c;日志消息消费我们…

模板概述

模板&#xff0c;按建筑学的说法是&#xff1a;施工时浇筑混凝土用的成组模型板&#xff1b;而模板之词&#xff0c;恐怕可释之为模型之板&#xff0c;顾名思义&#xff0c;模板为一套规定好了规范准则的样板。既然为样板&#xff0c;自然是可被多方使用&#xff1b;而准则既已…

我凭什么拿到了阿里、腾讯、今日头条3家大厂offer?通用流行框架大全

前言 从毕业到现在面试也就那么几家公司&#xff0c;单前几次都比较顺利&#xff0c;在面到第三家时都给到了我offer&#xff01;前面两次找工作&#xff0c;没考虑到以后需要什么&#xff0c;自己的对未来的规划是什么&#xff0c;只要有份工作&#xff0c;工资符合自己的要求…

解决读写分离过期读的几个方案

mysql读写分离的坑 读写分离的主要目标是分摊主库的压力&#xff0c;由客户端选择后端数据库进行查询。还有种架构就是在MYSQL和客户端之间有一个中间代理层proxy&#xff0c;客户端之连接proxy&#xff0c;由proxy根据请求类型和上下文决定请求的分发路由。 客户端直连方案&am…

Feign接口 多线程问题

Spring Cloud Feign传输Header&#xff0c;并保证多线程情况下也适用 一、现象 微服务在生产中&#xff0c;常遇到需要把 header 传递到下一子服务的情况&#xff08;如服务A访问服务B的接口&#xff0c;需要传递header&#xff09;&#xff0c;网上大多数的方案是实现 Request…

serial port 的操作

import serial①选择设备serserial.Serial("/dev/ttyUSB0",9600,timeout0.5) #使用USB连接串行口serserial.Serial("/dev/ttyAMA0",9600,timeout0.5) #使用树莓派的GPIO口连接串行口serserial.Serial(1,9600,timeout0.5)#winsows系统使用com1口连接串行口s…