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的时候,所有的方法中在笔者的项目中是添加有日志的。至于为什么添加日志本文就不介绍了。