分布式鎖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.pswp.cn/news/386472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386472.shtml
英文地址,請注明出處:http://en.pswp.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…