Redisson是一個在Redis的基礎上實現的Java常駐內存數據網格(In-Memory Data Grid)。它不僅提供了一系列的分布式的Java常用對象,還提供了許多分布式服務。Redisson提供了使用Redis的簡單、便捷的方法,官網地址為:https://github.com/redisson/redisson/wiki/目錄。本文主要介紹使用Redisson操作redis,使用到的軟件版本:Java 1.8.0_191、Redis 5.0.8、Redisson 3.13.2。
1、引入依賴
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.2</version> </dependency>
2、Redisson操作redis
package com.inspur.demo.general.redis; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.redisson.Redisson; import org.redisson.api.*; import org.redisson.config.Config; import java.io.*; import java.util.concurrent.TimeUnit; /** * Redisson操作redis * Redisson除了提供同步接口外,還提供了異步(Async)、反射式(Reactive)和RxJava2標准的接口。 * Redisson會序列化java對象然后保存到reids,所以通過redis命令行設置的值,Redisson來獲取值會報錯;通redis命令行獲取Redisson設置的值前面會多出序列化相關的信息 */ public class RedissonCase { private RedissonClient client; private RedissonReactiveClient reactiveClient; private RedissonRxClient rxClient; @Before public void before() { Config config = new Config(); //config.setCodec(new org.redisson.client.codec.StringCodec()); config.useSingleServer().setAddress("redis://10.49.196.10:6379").setPassword("123456"); client = Redisson.create(config); reactiveClient = Redisson.createReactive(config); rxClient = Redisson.createRx(config); } @After public void after() { client.shutdown(); reactiveClient.shutdown(); rxClient.shutdown(); } /** * 通用對象桶,可以用來存放任類型的對象 */ @Test public void bucket() throws Exception { //同步 RBucket<String> bucket = client.getBucket("name"); bucket.set("zhaoyun"); System.out.println(bucket.get()); //異步 RBucket<String> bucket2 = client.getBucket("name2"); bucket2.setAsync("趙雲2").get(); bucket2.getAsync().thenAccept(System.out::println); //Reactive RBucketReactive<String> bucket3 = reactiveClient.getBucket("name3"); bucket3.set("趙雲3").block(); bucket3.get().subscribe(System.out::println); //RxJava2 RBucketRx<String> bucket4 = rxClient.getBucket("name4"); bucket4.set("趙雲4").blockingGet(); bucket4.get().subscribe(System.out::println); Thread.sleep(1000 * 5); } /** * 二進制流 * 提供了InputStream接口和OutputStream接口的實現 */ @Test public void stream() throws Exception { RBinaryStream stream = client.getBinaryStream("stream"); stream.set("趙雲".getBytes()); OutputStream outputStream = stream.getOutputStream(); outputStream.write("張飛".getBytes()); InputStream inputStream = stream.getInputStream(); ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int len; while ((len = inputStream.read(b)) != -1) { result.write(b, 0, len); } System.out.println(result.toString()); } @Test public void atomicLong() { RAtomicLong atomicLong = client.getAtomicLong("atomicLong"); atomicLong.set(10); atomicLong.incrementAndGet(); System.out.println(atomicLong); } /** * 限流器 */ @Test public void rateLimiter() throws InterruptedException { RRateLimiter rateLimiter = client.getRateLimiter("rateLimiter"); //初始化 最大流速:每1秒鍾產生5個令牌 rateLimiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS); for (int i = 0; i < 10; i++) { new Thread(new Runnable() { int i = 0; @Override public void run() { while(true) { rateLimiter.acquire(1); System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + i++); } } }).start(); } Thread.sleep(1000 * 5); } /** * RList實現了java.util.List接口 */ @Test public void list() { RList<String> list = client.getList("list"); list.add("a"); list.add("趙雲"); list.add("張飛"); list.remove(1); System.out.println(list); } /** * RMap實現了java.util.concurrent.ConcurrentMap接口和java.util.Map接口 * @throws Exception */ @Test public void map() throws Exception { RMap<String, String> map = client.getMap("map"); map.put("name", "趙雲"); map.put("location", "常山"); map.put("camp", "蜀"); map.remove("location"); map.forEach((key, value) -> {System.out.println("key=" + key + ",value=" + value);}); } /** * RSet實現了java.util.Set接口 * @throws Exception */ @Test public void set() { RSet<String> set = client.getSet("set"); set.add("趙雲"); set.add("張飛"); set.forEach(System.out::println); } /** * RQueue實現了java.util.Queue接口 */ @Test public void queue() { RQueue<String> queue = client.getQueue("queue"); queue.add("趙雲"); queue.add("張飛"); System.out.println(queue.poll()); System.out.println(queue.poll()); } /** * 可重入鎖 RLock實現了java.util.concurrent.locks.Lock接口 */ @Test public void lock() throws InterruptedException { RLock lock = client.getLock("lock"); for (int i = 0; i < 5; i++) { new Thread(() -> { lock.lock(); try { System.out.println(Thread.currentThread() + "-" + System.currentTimeMillis() + "-" + "獲取了鎖"); Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }).start(); } Thread.sleep(1000 * 5); } /** * Redisson的分布式RBitSetJava對象采用了與java.util.BiteSet類似結構的設計風格 */ @Test public void bitSet() { RBitSet bitSet = client.getBitSet("bs"); bitSet.expire(5, TimeUnit.DAYS); bitSet.set(0, true); bitSet.set(20, true); bitSet.set(96, true); System.out.println(bitSet.get(10)); System.out.println(bitSet.get(20)); } /** * Redisson利用Redis實現了Java分布式布隆過濾器(Bloom Filter) */ @Test public void bf() { RBloomFilter<String> bf = client.getBloomFilter("qq"); if (!bf.isExists()) { bf.tryInit(150000000L, 0.05); bf.add("test"); bf.expire(200, TimeUnit.SECONDS); } bf.add("https://www.baidu.com/"); bf.add("https://www.tmall.com/"); bf.add("https://www.jd.com/"); System.out.println(bf.contains("https://www.tmall.com/")); System.out.println(bf.count()); } }
3、Redisson配置
package com.inspur.demo.general.redis; import org.junit.Test; import org.redisson.Redisson; import org.redisson.api.RBucket; import org.redisson.api.RedissonClient; import org.redisson.config.Config; /** * Redisson配置 */ public class RedissonConfigCase { /** * 單Redis節點模式 */ @Test public void singl() { Config config = new Config(); config.useSingleServer() .setAddress("redis://10.49.196.10:6379") .setPassword("123456") .setConnectionPoolSize(5)//連接池大小 .setConnectionMinimumIdleSize(2)//最小空閑連接數 .setDatabase(0); RedissonClient client = Redisson.create(config); RBucket<String> name = client.getBucket("name"); System.out.println(name.get()); } /** * 主從模式 */ @Test public void masterSlave() { Config config = new Config(); config.useMasterSlaveServers() .setMasterAddress("redis://10.49.196.20:6379") .addSlaveAddress("redis://10.49.196.21:6379") .addSlaveAddress("redis://10.49.196.22:6379") .setPassword("123456") .setMasterConnectionPoolSize(5)//主節點連接池大小 .setMasterConnectionMinimumIdleSize(2)//主節點最小空閑連接數 .setSlaveConnectionPoolSize(5)//從節點連接池大小 .setSlaveConnectionMinimumIdleSize(2)//從節點最小空閑連接數 .setDatabase(0); RedissonClient client = Redisson.create(config); RBucket<String> name = client.getBucket("name"); System.out.println(name.get()); } /** * 哨兵模式 */ @Test public void sentinel() { Config config = new Config(); config.useSentinelServers() .setMasterName("mymaster") .addSentinelAddress("redis://10.49.196.20:26379") .addSentinelAddress("redis://10.49.196.21:26379") .addSentinelAddress("redis://10.49.196.22:26379") .setPassword("123456") .setMasterConnectionPoolSize(5)//主節點連接池大小 .setMasterConnectionMinimumIdleSize(3)//主節點最小空閑連接數 .setSlaveConnectionPoolSize(5)//從節點連接池大小 .setSlaveConnectionMinimumIdleSize(3)//從節點最小空閑連接數 .setCheckSentinelsList(false) .setDatabase(0); System.out.println(config.useSentinelServers().getSentinelAddresses()); RedissonClient client = Redisson.create(config); RBucket<String> name = client.getBucket("name"); name.set("趙雲"); System.out.println(name.get()); } /** * 集群 */ @Test public void cluster() { Config config = new Config(); config.useClusterServers() .setScanInterval(1000 * 2) .addNodeAddress("redis://10.49.196.20:7000", "redis://10.49.196.20:7001") .addNodeAddress("redis://10.49.196.21:7000", "redis://10.49.196.21:7001") .addNodeAddress("redis://10.49.196.22:7000", "redis://10.49.196.22:7001") .setPassword("123456") .setMasterConnectionPoolSize(5) .setMasterConnectionMinimumIdleSize(2) .setSlaveConnectionPoolSize(5) .setSlaveConnectionMinimumIdleSize(2); RedissonClient client = Redisson.create(config); RBucket<String> name = client.getBucket("name"); name.set("趙雲"); System.out.println(name.get()); } }