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命令\