zoukankan      html  css  js  c++  java
  • Redis入门实战(6)-Redisson操作redis

    Redisson是一个在Redis的基础上实现的Java常驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。Redisson提供了使用Redis的简单、便捷的方法。本文主要介绍使用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 io.reactivex.Scheduler;
    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 redis.clients.jedis.Jedis;
    
    import java.io.*;
    import java.sql.SQLSyntaxErrorException;
    import java.util.BitSet;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 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);
        }
    }

    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());
        }
    }
  • 相关阅读:
    [转]C# const和static readonly区别
    【整理】C#文件操作大全(SamWang)
    【类】C#计算器类(SamWang)
    [转]数据结构(C#版)概念整理
    【类】C# 文件操作类(SamWang)
    【原创】C# 实现拖拉控件改变位置与大小(SamWang)(附源代码下载)
    [转]关于release和debug的区别
    ASCII码值表
    Flex 4自定义皮肤的使用方法
    C++ 动态链接库 显式调用
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/13262774.html
Copyright © 2011-2022 走看看