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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: NoSQL之Redis(五)--- Redis测试以及其与spring的集成

概述


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

 

        Jedis


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

 

        Redis安装测试


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

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testJedisSingle() {  
  3.         // 创建一个jedis的对象。  
  4.         Jedisjedis= newJedis("192.168.21.225"6379);  
  5.         // 调用jedis对象的方法,方法名称和redis的命令一致。  
  6.         jedis.set("key1""jedis test");  
  7.         Stringstring= jedis.get("key1");  
  8.         System.out.println(string);  
  9.         // 关闭jedis。每次用完之后都应该关闭jedis  
  10.         jedis.close();  
  11.     }  


        测试结果入下:

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

  

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.    * 使用连接池 
  3.    */  
  4.   @Test  
  5.   public void testJedisPool() {  
  6.       // 创建jedis连接池  
  7.       JedisPoolpool= newJedisPool("192.168.21.225"6379);  
  8.       // 从连接池中获得Jedis对象  
  9.       Jedisjedis= pool.getResource();  
  10.       Stringstring= jedis.get("key1");  
  11.       System.out.println(string);  
  12.       // 关闭jedis对象  
  13.       jedis.close();  
  14.       pool.close();  
  15.   }  

        运行结果入下:

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

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testJedisCluster() {  
  3.         HashSet<HostAndPort>nodes= newHashSet<>();  
  4.         nodes.add(new HostAndPort("192.168.21.225",7001));  
  5.         nodes.add(new HostAndPort("192.168.21.225",7002));  
  6.         nodes.add(new HostAndPort("192.168.21.225",7003));  
  7.         nodes.add(new HostAndPort("192.168.21.225",7004));  
  8.         nodes.add(new HostAndPort("192.168.21.225",7005));  
  9.         nodes.add(new HostAndPort("192.168.21.225",7006));  
  10.    
  11.         JedisClustercluster= newJedisCluster(nodes);  
  12.    
  13.         cluster.set("key1""1000");  
  14.         Stringstring= cluster.get("key1");  
  15.         System.out.println(string);  
  16.    
  17.         cluster.close();  
  18.     }  


        测试结果入下:

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

 

        与Spring的集成

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


        连接池配置


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

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 连接池配置 -->  
  2.     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
  3.         <!-- 最大连接数 -->  
  4.         <property name="maxTotal" value="30" />  
  5.         <!-- 最大空闲连接数 -->  
  6.         <property name="maxIdle" value="10" />  
  7.         <!-- 每次释放连接的最大数目 -->  
  8.         <property name="numTestsPerEvictionRun" value="1024" />  
  9.         <!-- 释放连接的扫描间隔(毫秒) -->  
  10.         <property name="timeBetweenEvictionRunsMillis" value="30000" />  
  11.         <!-- 连接最小空闲时间 -->  
  12.         <property name="minEvictableIdleTimeMillis" value="1800000" />  
  13.         <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->  
  14.         <property name="softMinEvictableIdleTimeMillis" value="10000" />  
  15.         <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->  
  16.         <property name="maxWaitMillis" value="1500" />  
  17.         <!-- 在获取连接的时候检查有效性, 默认false -->  
  18.         <property name="testOnBorrow" value="true" />  
  19.         <!-- 在空闲时检查有效性, 默认false -->  
  20.         <property name="testWhileIdle" value="true" />  
  21.         <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->  
  22.         <property name="blockWhenExhausted" value="false" />  
  23.     </bean>  

        单机配置

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <bean id="redisClient" class="redis.clients.jedis.JedisPool">  
  2.         <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  3.         <constructor-arg name="port" value="6379"></constructor-arg>  
  4.         <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>  
  5.         <bean id="jedisClient" class="com.taotao.rest.dao.impl.JedisClientSingle" />  
  6.     </bean>  


        集群配置

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <bean id="redisClient" class="redis.clients.jedis.JedisCluster">  
  2.         <constructor-arg name="nodes">  
  3.             <set>  
  4.                 <bean class="redis.clients.jedis.HostAndPort">  
  5.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  6.                     <constructor-arg name="port" value="7001"></constructor-arg>  
  7.                 </bean>  
  8.                 <bean class="redis.clients.jedis.HostAndPort">  
  9.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  10.                     <constructor-arg name="port" value="7002"></constructor-arg>  
  11.                 </bean>  
  12.                 <bean class="redis.clients.jedis.HostAndPort">  
  13.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  14.                     <constructor-arg name="port" value="7003"></constructor-arg>  
  15.                 </bean>  
  16.                 <bean class="redis.clients.jedis.HostAndPort">  
  17.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  18.                     <constructor-arg name="port" value="7004"></constructor-arg>  
  19.                 </bean>  
  20.                 <bean class="redis.clients.jedis.HostAndPort">  
  21.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  22.                     <constructor-arg name="port" value="7005"></constructor-arg>  
  23.                 </bean>  
  24.                 <bean class="redis.clients.jedis.HostAndPort">  
  25.                     <constructor-arg name="host" value="192.168.21.225"></constructor-arg>  
  26.                     <constructor-arg name="port" value="7006"></constructor-arg>  
  27.                 </bean>  
  28.             </set>  
  29.         </constructor-arg>  
  30.         <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>  
  31.     </bean>  
  32.     <bean id="jedisClientCluster"class="com.taotao.rest.dao.impl.JedisClientCluster"></bean>  

        工具类


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

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public interfaceJedisClient {  
  2.    
  3.     Stringget(String key);  
  4.    
  5.     Stringset(String key,String value);  
  6.    
  7.     Stringhget(String hkey,String key);  
  8.    
  9.     long hset(String hkey, String key, String value);  
  10.    
  11.     long incr(String key);  
  12.    
  13.     long expire(String key, int second);  
  14.    
  15.     long ttl(String key);  
  16.    
  17.     long del(String key);  
  18.    
  19.     long hdel(String hkey, String key);  
  20. }  

 

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


        单机实现

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public classJedisClientSingle implements JedisClient{  
  2.      
  3.     @Autowired  
  4.     private JedisPool jedisPool;  
  5.      
  6.     @Override  
  7.     public String get(String key) {  
  8.         Jedisjedis= jedisPool.getResource();  
  9.         Stringstring= jedis.get(key);  
  10.         jedis.close();  
  11.         return string;  
  12.     }  
  13.    
  14.     @Override  
  15.     public String set(String key, String value) {  
  16.         Jedisjedis= jedisPool.getResource();  
  17.         Stringstring= jedis.set(key, value);  
  18.         jedis.close();  
  19.         return string;  
  20.     }  
  21.    
  22.     @Override  
  23.     public String hget(String hkey, String key) {  
  24.         Jedisjedis= jedisPool.getResource();  
  25.         Stringstring= jedis.hget(hkey, key);  
  26.         jedis.close();  
  27.         return string;  
  28.     }  
  29.    
  30.     @Override  
  31.     public long hset(String hkey, String key, String value) {  
  32.         Jedisjedis= jedisPool.getResource();  
  33.         Longresult= jedis.hset(hkey, key, value);  
  34.         jedis.close();  
  35.         return result;  
  36.     }  
  37.    
  38.     @Override  
  39.     public long incr(String key) {  
  40.         Jedisjedis= jedisPool.getResource();  
  41.         Longresult= jedis.incr(key);  
  42.         jedis.close();  
  43.         return result;  
  44.     }  
  45.    
  46.     @Override  
  47.     public long expire(String key, int second) {  
  48.         Jedisjedis= jedisPool.getResource();  
  49.         Longresult= jedis.expire(key, second);  
  50.         jedis.close();  
  51.         return result;  
  52.     }  
  53.    
  54.     @Override  
  55.     public long ttl(String key) {  
  56.         Jedisjedis= jedisPool.getResource();  
  57.         Longresult= jedis.ttl(key);  
  58.         jedis.close();  
  59.         return result;  
  60.     }  
  61.    
  62.     @Override  
  63.     public long del(String key) {  
  64.         Jedis jedis = jedisPool.getResource();  
  65.         Longresult= jedis.del(key);  
  66.         jedis.close();  
  67.         return result;  
  68.     }  
  69.    
  70.     @Override  
  71.     public long hdel(String hkey, String key) {  
  72.         Jedisjedis= jedisPool.getResource();  
  73.         Longresult= jedis.hdel(hkey, key);  
  74.         jedis.close();  
  75.         return result;  
  76.     }  
  77. }  


        集群实现

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public classJedisClientCluster implements JedisClient {  
  2.    
  3.     @Autowired  
  4.     private JedisCluster jedisCluster;  
  5.      
  6.     @Override  
  7.     public String get(String key) {  
  8.         return jedisCluster.get(key);  
  9.     }  
  10.    
  11.     @Override  
  12.     public String set(String key, String value) {  
  13.         return jedisCluster.set(key, value);  
  14.     }  
  15.    
  16.     @Override  
  17.     public String hget(String hkey, String key) {  
  18.         return jedisCluster.hget(hkey, key);  
  19.     }  
  20.    
  21.     @Override  
  22.     public long hset(String hkey, String key, String value) {  
  23.         return jedisCluster.hset(hkey, key, value);  
  24.     }  
  25.    
  26.     @Override  
  27.     public long incr(String key) {  
  28.         return jedisCluster.incr(key);  
  29.     }  
  30.    
  31.     @Override  
  32.     public long expire(String key, int second) {  
  33.         return jedisCluster.expire(key, second);  
  34.     }  
  35.    
  36.     @Override  
  37.     public long ttl(String key) {  
  38.         return jedisCluster.ttl(key);  
  39.     }  
  40.    
  41.     @Override  
  42.     public long del(String key) {  
  43.         return jedisCluster.del(key);  
  44.     }  
  45.    
  46.     @Override  
  47.     public long hdel(String hkey, String key) {  
  48.         return jedisCluster.hdel(hkey, key);  
  49.     }  
  50. }  

        测试

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


        单机测试

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testSpringJedisSingle(){  
  3.         ApplicationContextapplicationContext = newClassPathXmlApplicationContext(  
  4.                 "classpath:spring/applicationContext-*.xml");  
  5.         JedisPoolpool= (JedisPool) applicationContext.getBean("redisClient");  
  6.         Jedisjedis= pool.getResource();  
  7.         Stringstring= jedis.get("key1");  
  8.         System.out.println(string);  
  9.         jedis.close();  
  10.         pool.close();  
  11.     }  


        集群测试

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public voidtestSpringJedisCluster() {  
  3.         ApplicationContextapplicationContext = newClassPathXmlApplicationContext(  
  4.                 "classpath:spring/applicationContext-*.xml");  
  5.         JedisClusterjedisCluster= (JedisCluster) applicationContext  
  6.                 .getBean("redisClient");  
  7.         StringstringjedisCluster.get("key1");  
  8.         System.out.println(string);  
  9.         jedisCluster.close();  
  10.     }  

        总结


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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
26天前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
49 0
|
1月前
|
敏捷开发 jenkins Devops
探索软件测试的新篇章:自动化与持续集成的融合之道
【9月更文挑战第31天】 在软件开发的海洋中,测试是确保航船稳健前行的灯塔。本文将引领读者驶入软件测试的新纪元,探索自动化测试和持续集成如何携手共创高效、可靠的开发流程。我们将从基础概念出发,逐步深入到实际操作层面,揭示这一现代软件开发模式的核心价值和实现路径。你将看到,通过代码示例和实践案例,如何将理论转化为提升软件质量的具体行动。
|
19天前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
40 3
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
8天前
|
监控 jenkins 测试技术
探索软件测试的新篇章:自动化与持续集成
【10月更文挑战第25天】在数字化时代的浪潮中,软件已成为驱动世界的核心力量。然而,随着软件复杂性的增加,传统的测试方法已无法满足快速迭代和高质量交付的需求。本文将探讨如何通过自动化测试和持续集成(CI)来提升软件开发的效率和质量,同时确保产品的稳定性和可靠性。我们将从自动化测试的基础出发,逐步深入到持续集成的实践,并展示如何通过实际案例实现这一转变。
|
8天前
|
jenkins 测试技术 持续交付
探索软件测试中的自动化与持续集成
【10月更文挑战第25天】在软件开发的海洋中,自动化测试和持续集成(CI)是引领航船穿越波涛的灯塔。本文将带你了解如何通过搭建自动化测试框架和实施持续集成策略来提高软件质量和开发效率。我们将以一个实际的代码示例为起点,逐步深入讲解如何整合自动化测试到你的CI/CD流程中。
|
8天前
|
jenkins 测试技术 持续交付
探索软件测试的新篇章:自动化与持续集成的融合
【10月更文挑战第25天】在软件开发的世界里,质量是王道。本文将带你领略如何通过自动化测试和持续集成(CI)的结合,提升软件交付的速度与质量,确保每一次代码提交都是一次胜利的宣言。
|
11天前
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
30 1
|
1月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
38 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
测试技术
软件质量保护与测试(第2版)学习总结第十三章 集成测试
本文是《软件质量保护与测试》(第2版)第十三章的学习总结,介绍了集成测试的概念、主要任务、测试层次与原则,以及集成测试的不同策略,包括非渐增式集成和渐增式集成(自顶向下和自底向上),并通过图示详细解释了集成测试的过程。
52 1
软件质量保护与测试(第2版)学习总结第十三章 集成测试