• Redis之客户端连接方式


    Reis的客户端连接方式有如下几种:

      1.基本方式

      

    /**
         * 简单基本方式调用
         */
        @Test
        public void test1JedisStandardClient() {
            Jedis jedis = new Jedis("192.168.56.101", 6379);
            jedis.set("123", "first line is null");
            String valueString = jedis.get("123");
            System.out.println("the result of redis statement is :"+valueString);
            System.out.println("the result of redis statement is :"+jedis.get("111"));
            jedis.close();
        }

      2.事务方式(基于乐观锁的事务,事务内的指令即使有执行失败的也不会回滚已经执行的,也不会影响事务内后续的指令的执行)

      主要有:watch,multi,exec,unwatch,discard等指令

      

    /**
         * 事务连接2 redis的事务一般与watch组合使用
         */
        @Test
        public void test3JredisTransactionAndWatch(){
            JedisPool jedisPool = new JedisPool("192.168.56.101", 6379);
            Jedis jedis = jedisPool.getResource();
            //开始观察“test2”
            String watch = jedis.watch("test2");
            System.out.println(Thread.currentThread().getName()+"--"+watch);
            //开启事务
            Transaction tx = jedis.multi();
            tx.set("test2", "I am is tiger");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //执行事务
            List list =tx.exec();
            System.out.println(Thread.currentThread().getName()+"exe list :"+list);
            //结束观察
            jedis.unwatch();
            
        }
    
        /**
         * 事务连接2 redis的事务一般与watch组合使用
         */
        @Test
        public void test3JedisTransactionAndWatch1(){
            JedisPool jedisPool = new JedisPool("192.168.56.101", 6379);
            Jedis jedis = jedisPool.getResource();
            //开始观察“test2”
            String watch = jedis.watch("test2");
            System.out.println(Thread.currentThread().getName()+"--"+watch);
            //开启事务
            Transaction tx = jedis.multi();
            tx.set("test2", "I am is snake");
            tx.set("test3", "I am is rocker");
            //事务执行
            List list= tx.exec();
            System.out.println(Thread.currentThread().getName()+"exe list :"+list);
            //结束观察
            jedis.unwatch();
        }

      3.集群方式(实际生产环境中推荐使用,高可用,数据分片,缺点集群不支持事务操作)

      

    /**
         * 配置文件方式的主从集群模式
         */
        @Test
        public void test4JedisClusterBySpring(){
            JedisCluster cluster = (JedisCluster) applicationContext.getBean("jedisCluster");
            cluster.set("s5", "555");
            String result = cluster.get("s5");
            System.out.println("the s5 is :"+result);
            System.out.println("the s4 is :"+cluster.get("s4"));
            System.out.println("the s3 is :"+cluster.get("s3"));
            System.out.println("the s2 is :"+cluster.get("s2"));
            cluster.close();
        }
      
    /**
         * 主从集群模式
         */
        @Test
        public void test4JedisCluster(){
            //创建cluster
            Set<HostAndPort> nodeSet = new HashSet<HostAndPort>();
            nodeSet.add(new HostAndPort("192.168.56.101", 7001));
            nodeSet.add(new HostAndPort("192.168.56.101", 7002));
            nodeSet.add(new HostAndPort("192.168.56.101", 7003));
            nodeSet.add(new HostAndPort("192.168.56.101", 7004));
            nodeSet.add(new HostAndPort("192.168.56.101", 7005));
            nodeSet.add(new HostAndPort("192.168.56.101", 7006));
            nodeSet.add(new HostAndPort("192.168.56.101", 7007));
            JedisCluster cluster = new JedisCluster(nodeSet);
            cluster.set("s4", "444");
            cluster.set("111","光辉岁月");
            cluster.set("8090","org.springwork.context.support.AbstractApplicationContext prepareRefresh");
            Map<String, JedisPool> nodes = cluster.getClusterNodes();
            String result = cluster.get("s4");
            System.out.println("the s4 is :"+result);
            System.out.println("the s4 is :"+cluster.get("111"));
            cluster.close();
        }

      4.哨兵方式(防止单节点宕机故障)

      

    /**
         * 主从的哨兵方式(方便主从架构的故障转移)
         * master下线后,不需要客户端改变ip和port,应该这种模式是连接哨兵,通过哨兵发现master(推荐)
         */
        @Test
        public void test2JedisClient1(){
            Set<String> sentinels = new HashSet<String>(16);
            sentinels.add("192.168.56.101:26379");//集群中所有sentinels的地址
            sentinels.add("192.168.56.101:26380");
            sentinels.add("192.168.56.101:26381");
            JedisPoolConfig config = new JedisPoolConfig();
            JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,config);
            Jedis jedis1 = pool.getResource();
            try{
                //
                jedis1.set("key","value");
                String valueString =jedis1.get("key");
                System.out.println("the result of redis statement is :"+valueString);
                System.out.println("the result of redis statement is :"+jedis1.get("111"));
            }catch (Exception e) {
                System.out.println("the system is broken");
            } 
            finally {
                pool.returnResourceObject(jedis1);
            }
            pool.close();
            
        }

      5.管道方式(执行效率高)

    /**
         * 管道方式的连接
         * 我们需要采用异步方式,一次发送很多指令,不同步等待其返回结果。这样可以取得很好的执行效率。
         */
        @Test
        public void test5JedisPipeline() {
            Jedis jedis = new Jedis("192.168.56.101", 6379);
            //创建管道
            Pipeline pipeline = jedis.pipelined();
            long start =System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                pipeline.set("p"+i, "p"+i);
            }
            List list = pipeline.syncAndReturnAll();
            long end =System.currentTimeMillis();
            System.out.println("PipeLined Set :"+((end - start)/1000.0)+"seconds");
            jedis.close();
        }
        
        /**
         * 管道中事务方式的连接
         */
        @Test
        public void test6JedisPipeline() {
            Jedis jedis = new Jedis("192.168.56.101", 6379);
            //创建管道
            Pipeline pipeline = jedis.pipelined();
            long start =System.currentTimeMillis();
            //管道开启事务
            pipeline.multi();
            for (int i = 0; i < 100000; i++) {
                pipeline.set("p"+i, "p"+i);
            }
            //事务执行
            pipeline.exec();
            //管道同步
            List list = pipeline.syncAndReturnAll();
            long end =System.currentTimeMillis();
            System.out.println("PipeLined Set :"+((end - start)/1000.0)+"seconds");
            jedis.close();
        }

    其他

      appliactioncontext.xml如下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd ">
                <!-- 连接池配置 -->
                <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
                    <!-- 最大连接数 -->
                    <property name="maxTotal" value="30" />
                    <!-- 最大空闲连接数 -->
                    <property name="maxIdle" value="10" />
                    <!-- 每次释放连接的最大数目 -->
                    <property name="numTestsPerEvictionRun" value="1024" />
                    <!-- 释放连接的扫描间隔(毫秒) -->
                    <property name="timeBetweenEvictionRunsMillis" value="30000" />
                    <!-- 连接最小空闲时间 -->
                    <property name="minEvictableIdleTimeMillis" value="1800000" />
                    <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
                    <property name="softMinEvictableIdleTimeMillis" value="10000" />
                    <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
                    <property name="maxWaitMillis" value="1500" />
                    <!-- 在获取连接的时候检查有效性, 默认false -->
                    <property name="testOnBorrow" value="true" />
                    <!-- 在空闲时检查有效性, 默认false -->
                    <property name="testWhileIdle" value="true" />
                    <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
                    <property name="blockWhenExhausted" value="false" />
                </bean>
                <!-- redis集群 -->
                <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
                    <constructor-arg index="0">
                        <set>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7001"></constructor-arg>
                            </bean>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7002"></constructor-arg>
                            </bean>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7003"></constructor-arg>
                            </bean>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7004"></constructor-arg>
                            </bean>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7005"></constructor-arg>
                            </bean>
                            <bean class="redis.clients.jedis.HostAndPort">
                                <constructor-arg index="0" value="192.168.56.101"></constructor-arg>
                                <constructor-arg index="1" value="7006"></constructor-arg>
                            </bean>
                        </set>
                    </constructor-arg>
                    <constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
                </bean>
    </beans>
  • 相关阅读:
    如何使用类
    面向过程编程与面向对象优缺点
    生成器和迭代器的藕断丝连
    三元运算
    python 和pycharm 安装
    命令提示符玩法
    模块
    包(package)
    logging模块
    1964、1969和1972---------为什么中国互联网大佬出生在这3个年份
  • 原文地址:https://www.cnblogs.com/fengyan20150508/p/8954237.html
Copyright © 2020-2023  润新知