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
目录
相关文章
|
3月前
|
敏捷开发 测试技术 持续交付
探索软件测试中的自动化与持续集成
在快速迭代的软件开发环境中,自动化测试和持续集成(CI)已成为确保产品质量和加速交付的关键策略。本文将深入探讨自动化测试的基本原理、实施步骤以及它如何与持续集成流程相结合,以提高软件开发的效率和可靠性。我们将通过实际案例分析,展示自动化测试和CI的最佳实践,以及它们如何帮助企业实现更快的市场响应时间和更高的客户满意度。
82 16
|
5天前
|
存储 人工智能 测试技术
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
112641 10
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
|
3月前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
3天前
|
人工智能 IDE 测试技术
用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
通义灵码, 作为国内首个 AI 程序员,从最开始的内测到公测,再到通义灵码正式发布第一时间使用,再到后来使用企业定制版的通义灵码,再再再到现在通义灵码2.0,我可以说“用着”通义灵码成长的为数不多的程序员之一了吧。咱闲言少叙,直奔主题!今天,我会聊一聊通义灵码的新功能和通义灵码2.0与1.0的体验感。
|
1月前
|
存储 监控 NoSQL
NoSQL与Redis配置与优化
通过合理配置和优化Redis,可以显著提高其性能和可靠性。选择合适的数据结构、优化内存使用、合理设置持久化策略、使用Pipeline批量执行命令、以及采用分布式集群方案,都是提升Redis性能的重要手段。同时,定期监控和维护Redis实例,及时调整配置,能够确保系统的稳定运行。希望本文对您在Redis的配置与优化方面有所帮助。
74 23
|
1月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
50 10
|
1月前
|
存储 监控 NoSQL
NoSQL与Redis配置与优化
通过合理配置和优化Redis,可以显著提高其性能和可靠性。选择合适的数据结构、优化内存使用、合理设置持久化策略、使用Pipeline批量执行命令、以及采用分布式集群方案,都是提升Redis性能的重要手段。
56 7
|
2月前
|
机器学习/深度学习 人工智能 jenkins
探索软件测试中的自动化与持续集成
【10月更文挑战第21天】 在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的进步和开发模式的转变,自动化测试和持续集成已经成为提高软件质量和效率的关键手段。本文将深入探讨自动化测试和持续集成的概念、实施策略以及它们如何相互配合以优化软件开发流程。我们将通过分析实际案例,展示这些技术如何在实际项目中发挥作用,以及面临的挑战和解决方案。此外,文章还将讨论未来趋势,包括人工智能在测试领域的应用前景。
101 17
|
3月前
|
Devops 测试技术 持续交付
软件测试中的自动化与持续集成:最佳实践与挑战
在快速迭代的软件开发周期中,自动化测试和持续集成(CI)已成为提高软件质量和加速产品上市的关键策略。本文探讨了自动化测试和CI的实施如何帮助开发团队提前发现缺陷、缩短反馈循环,并确保代码质量。我们将深入分析自动化测试的策略选择、工具应用以及面临的挑战,同时提供一些克服这些挑战的最佳实践。
117 15
|
2月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
234 5