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