Redis之客户端连接方式

Stella981
• 阅读 470

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>
点赞
收藏
评论区
推荐文章
灯灯灯灯 灯灯灯灯
3年前
牛皮了!遇到“ORA-12154: TNS: 无法解析指定的连接标识符”错误,到底该如何解决?
相信使用过Oracle数据库的人一定碰到过“ORA12154:TNS:无法解析指定的连接标识符”错误,我在此做一个小小的总结。在程序中连接Oracle数据库的方式与其他常用数据库,如:MySql,SqlServer不同,这些数据库可以通过直接指定IP的方式连接,但是Oracle则需要通过Oracle客户端配置网络服务名的方式来连接。否则就会出现“
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java 调用RESTful接口的几种方式
前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate服务端代码如下:服务端接口请求的URL:http://localhost:8080/rest/user/getUser/xiaoming/18(https://www.oschina.net/a
Wesley13 Wesley13
3年前
HCNA实验
HCNA实验配置基于接口地址池的DHCPDHCP动态主机配置协议DHCP协议采用客户端/服务器的方式工作与DHCP服务器建立连接的4个阶段发现阶段:DHCP客户端寻找DHCP服务器的阶段,客户端以广播的方式发送DHCP\_Disco
Stella981 Stella981
3年前
Magento Block的几种调用方式
MagentoBlock的三种显示方式1。最常见的一种方式:在layout文件中配置,然后在.phtml模板文件中输出。<cms_page<referencename"content"<blocktype"cms/page"name"cms_page"</block</
Wesley13 Wesley13
3年前
mysql中count()函数的用法
数量查询时,有如下几种方式:1.下面三种方式,在多数情况下效率是基本相同的,但问题在于,很多情况下,我们数据库可能有脏数据,比如重复数据,或者某条数据重要字段是null的,那下面的这几种,会把这种脏数据也统计上,本质都是统计满足条件的行数的:selectcount()fromuserselectcount(1)f
Stella981 Stella981
3年前
Redis哈希对象的ziplist编码实现了O(1)复杂度吗
问题:Redis中哈希对象有两种编码方式,分别是ziplist、hashtable方式。哈希对象,总得体现哈希算法,使得基本操作达到O(1)的效率。hashtable编码方式使用字典,也即是Java中hashMap的方式,这个我可以理解。但是,ziplist方式所有元素都是紧挨的,它是怎么实现hash,并使得查询等操作有O(1)的时间效率的呢?让我们
Stella981 Stella981
3年前
Redis高可用技术解决方案总结
一、常见使用方式Redis的几种常见使用方式包括:Redis单副本;Redis多副本(主从);RedisSentinel(哨兵);RedisCluster;Redis自研。二、各种使用方式的优缺点1、Redis单副本Redis单副本,采用
Stella981 Stella981
3年前
Socket心跳机制
本文是我在实际工作中用到的Socket通信,关于心跳机制的维护方式,特意总结了一下,希望对朋友们有所帮助。Socket应用:首先Socket封装了tcp协议的,通过长连接的方式来与服务器通信,是由服务器和客户端两部分组成的,当客户端成功连接之后,服务器会记录这个用户,并为它分配资源,当客户端断开连接后,服务器会自动释放资源。但在实际的网络环
一种读取亿级doris数据库的方法 | 京东云技术团队
1.工作中,常常需要将线上doris同步至集市。读取doris数据同读取常规mysql基本相同。如果数据行小于千万,比较简单的方式直接单节点连接、读取和存储。Python示例如下:defgetdata(sql,host'',port2000,user'',