NoSQL之Redis五--- Redis测试以及其与Spring的集成


NoSQL之Redis(五)--- Redis测试以及其与Spring的集成


概述


本文是紧接着上文安装好单机版的redis和rediscluster的之后需要去验证是否安装成功,以及如何和Spring集成到一起。

Jedis


Jedis是是Redis官方推荐的Java客户端开发包,用于处理redis服务上的缓存数据。笔者用的是Jedis-2.7.2.jar

Redis安装测试


接着这上文,我们先简单的写一个测试类,测试一下单机版的redis是否已经可用

@Test
    public void testJedisSingle() {
        // 创建一个jedis的对象。
        Jedisjedis= newJedis("192.168.21.225",6379);
        // 调用jedis对象的方法,方法名称和redis的命令一致。
        jedis.set("key1","jedis test");
        Stringstring= jedis.get("key1");
        System.out.println(string);
        // 关闭jedis。每次用完之后都应该关闭jedis
        jedis.close();
    }


测试结果入下:

在实际的运用过程中,我们基本上不会这样每连接一次redis就去创建一个Jedis对象,而是会在程序加载的时候直接创建一个连接池。测试方法如下

  /**
     * 使用连接池
     */
    @Test
    public void testJedisPool() {
        // 创建jedis连接池
        JedisPoolpool= newJedisPool("192.168.21.225",6379);
        // 从连接池中获得Jedis对象
        Jedisjedis= pool.getResource();
        Stringstring= jedis.get("key1");
        System.out.println(string);
        // 关闭jedis对象
        jedis.close();
        pool.close();
    }

运行结果入下:

测试完单机版之后,我们接下来看看如何使用Jedis操作redis集群(本文使用的是伪集群)

@Test
    public void testJedisCluster() {
        HashSet<HostAndPort>nodes= newHashSet<>();
        nodes.add(new HostAndPort("192.168.21.225",7001));
        nodes.add(new HostAndPort("192.168.21.225",7002));
        nodes.add(new HostAndPort("192.168.21.225",7003));
        nodes.add(new HostAndPort("192.168.21.225",7004));
        nodes.add(new HostAndPort("192.168.21.225",7005));
        nodes.add(new HostAndPort("192.168.21.225",7006));
 
        JedisClustercluster= newJedisCluster(nodes);
 
        cluster.set("key1","1000");
        Stringstring= cluster.get("key1");
        System.out.println(string);
 
        cluster.close();
    }


测试结果入下:

通过上面的测试一方面我们知道了如何简单的去操作redis,另一方面也验证在之前介绍的redis的按照是没有问题的。

与Spring的集成

下面我们看看在spring的配置文件中如何配置redis的参数和Jedis相关的东西。


连接池配置


首先我们看看redis连接池的配置

<!-- 连接池配置 -->
	<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>

单机配置

<bean id="redisClient" class="redis.clients.jedis.JedisPool">
		<constructor-arg name="host" value="192.168.21.225"></constructor-arg>
		<constructor-arg name="port" value="6379"></constructor-arg>
		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
		<bean id="jedisClient" class="com.taotao.rest.dao.impl.JedisClientSingle" />
	</bean>


集群配置

<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="192.168.21.225"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    </bean>
    <bean id="jedisClientCluster"class="com.taotao.rest.dao.impl.JedisClientCluster"></bean>

工具类


为了方便笔者直接调用Jedis去操作redis,所以笔者写了一个JedisClient工具类,如下

public interfaceJedisClient {
 
    Stringget(String key);
 
    Stringset(String key,String value);
 
    Stringhget(String hkey,String key);
 
    long hset(String hkey,String key,String value);
 
    long incr(String key);
 
    long expire(String key,int second);
 
    long ttl(String key);
 
    long del(String key);
 
    long hdel(String hkey,String key);
}

由于对单机和集群的redis操作时不一样的,所以实现工具类的时候单机和集群的实现方式是不一样的。


单机实现

public classJedisClientSingle implements JedisClient{
   
    @Autowired
    private JedisPool jedisPool;
   
    @Override
    public String get(String key) {
        Jedisjedis= jedisPool.getResource();
        Stringstring= jedis.get(key);
        jedis.close();
        return string;
    }
 
    @Override
    public String set(String key,String value) {
        Jedisjedis= jedisPool.getResource();
        Stringstring= jedis.set(key,value);
        jedis.close();
        return string;
    }
 
    @Override
    public String hget(String hkey,String key) {
        Jedisjedis= jedisPool.getResource();
        Stringstring= jedis.hget(hkey,key);
        jedis.close();
        return string;
    }
 
    @Override
    public long hset(String hkey,String value) {
        Jedisjedis= jedisPool.getResource();
        Longresult= jedis.hset(hkey,key,value);
        jedis.close();
        return result;
    }
 
    @Override
    public long incr(String key) {
        Jedisjedis= jedisPool.getResource();
        Longresult= jedis.incr(key);
        jedis.close();
        return result;
    }
 
    @Override
    public long expire(String key,int second) {
        Jedisjedis= jedisPool.getResource();
        Longresult= jedis.expire(key,second);
        jedis.close();
        return result;
    }
 
    @Override
    public long ttl(String key) {
        Jedisjedis= jedisPool.getResource();
        Longresult= jedis.ttl(key);
        jedis.close();
        return result;
    }
 
    @Override
    public long del(String key) {
        Jedis jedis = jedisPool.getResource();
        Longresult= jedis.del(key);
        jedis.close();
        return result;
    }
 
    @Override
    public long hdel(String hkey,String key) {
        Jedisjedis= jedisPool.getResource();
        Longresult= jedis.hdel(hkey,key);
        jedis.close();
        return result;
    }
}


集群实现

public classJedisClientCluster implements JedisClient {
 
    @Autowired
    private JedisCluster jedisCluster;
   
    @Override
    public String get(String key) {
        return jedisCluster.get(key);
    }
 
    @Override
    public String set(String key,String value) {
        return jedisCluster.set(key,value);
    }
 
    @Override
    public String hget(String hkey,String key) {
        return jedisCluster.hget(hkey,key);
    }
 
    @Override
    public long hset(String hkey,String value) {
        return jedisCluster.hset(hkey,value);
    }
 
    @Override
    public long incr(String key) {
        return jedisCluster.incr(key);
    }
 
    @Override
    public long expire(String key,int second) {
        return jedisCluster.expire(key,second);
    }
 
    @Override
    public long ttl(String key) {
        return jedisCluster.ttl(key);
    }
 
    @Override
    public long del(String key) {
        return jedisCluster.del(key);
    }
 
    @Override
    public long hdel(String hkey,String key) {
        return jedisCluster.hdel(hkey,key);
    }
}

测试

下面是测试配置以及工具类的方法


单机测试

@Test
    public void testSpringJedisSingle(){
        ApplicationContextapplicationContext = newClassPathXmlApplicationContext(
                "classpath:spring/applicationContext-*.xml");
        JedisPoolpool= (JedisPool) applicationContext.getBean("redisClient");
        Jedisjedis= pool.getResource();
        Stringstring= jedis.get("key1");
        System.out.println(string);
        jedis.close();
        pool.close();
    }


集群测试

@Test
    public voidtestSpringJedisCluster() {
        ApplicationContextapplicationContext = newClassPathXmlApplicationContext(
                "classpath:spring/applicationContext-*.xml");
        JedisClusterjedisCluster= (JedisCluster) applicationContext
                .getBean("redisClient");
        Stringstring= jedisCluster.get("key1");
        System.out.println(string);
        jedisCluster.close();
    }

总结


至此,本文的的写作目的——测试集群,以及redis配置与Spring集成就达到了。其实在笔者在写本文的时候,一方面是对之前项目中redis运用的优化,另一方面在实际的其实本文在实现JedisClient的时候,所有的方法中在笔者的项目中是添加有日志的。至于为什么添加日志本文就不介绍了。

相关文章

文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的...
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒...
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb...
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn...
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无...