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

本文涉及的产品
云数据库 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
目录
相关文章
|
2天前
|
敏捷开发 监控 数据管理
探索自动化测试在持续集成中的关键作用
【5月更文挑战第18天】 随着敏捷开发和持续集成(CI)的普及,自动化测试已成为确保软件质量和加速交付过程的核心实践。本文将深入探讨自动化测试在持续集成环境中的重要性,分析其如何提高测试效率、降低错误率,并促进团队间的协作。我们将通过具体案例,阐述如何有效地整合自动化测试工具,并讨论面临的挑战及解决策略。文章旨在为软件开发和测试团队提供实施高效自动化测试流程的参考和启示。
|
3天前
|
敏捷开发 运维 监控
深入探索软件测试中的持续集成与持续部署(CI/CD)实践
【5月更文挑战第17天】 在现代软件开发过程中,"持续集成"(Continuous Integration, CI)和"持续部署"(Continuous Deployment, CD)已经成为提高开发效率、确保代码质量和加速产品上市速度的关键策略。本文将深入探讨CI/CD在软件测试中的应用,包括它们的定义、目的、实施策略以及面临的挑战。通过对自动化测试、版本控制、构建流程和反馈循环的详细分析,我们将揭示如何利用CI/CD实践来优化测试流程,减少错误,并确保高质量的软件交付。
|
3天前
|
敏捷开发 Java 测试技术
探索自动化测试在持续集成环境中的关键作用
【5月更文挑战第16天】 在现代软件开发的快节奏中,持续集成(CI)已成为确保产品质量和加快交付速度的重要实践。本文深入探讨自动化测试作为持续集成不可或缺一环的核心价值,揭示其在保障软件项目高效、稳定推进中的作用。我们将分析自动化测试如何与CI流程协同工作,提升测试覆盖率,降低错误率,并讨论实现策略及面临的挑战。通过案例研究和最佳实践的分享,旨在为读者提供实施高效自动化测试策略的洞见。
|
5天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
17 2
|
5天前
|
敏捷开发 监控 Devops
深入探索软件测试中的持续集成与持续部署(CI/CD)实践
【5月更文挑战第13天】 在现代软件开发的快节奏和复杂性中,持续集成(Continuous Integration,CI)与持续部署(Continuous Deployment,CD)成为确保软件质量和加速交付的关键策略。本文将深入探讨CI/CD在软件测试中的应用,解析其核心概念、流程以及面临的挑战,并分享实际案例分析以揭示如何在不断变化的开发环境中维持高效和可靠的软件发布周期。
|
5天前
|
Web App开发 测试技术 C++
Playwright安装与Python集成:探索跨浏览器测试的奇妙世界
Playwright是新兴的跨浏览器测试工具,相比Selenium,它支持Chrome、Firefox、WebKit,执行速度快,选择器更稳定。安装Playwright只需一条`pip install playwright`的命令,随后的`playwright install`会自动添加浏览器,无需处理浏览器驱动问题。这一优势免去了Selenium中匹配驱动的烦恼。文章适合寻求高效自动化测试解决方案的开发者。
14 2
|
5天前
|
NoSQL Java MongoDB
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
【5月更文挑战第11天】本文介绍了如何将非关系型数据库MongoDB与Spring Boot框架集成,以实现高效灵活的数据管理。Spring Boot简化了Spring应用的构建和部署,MongoDB则以其对灵活数据结构的处理能力受到青睐。集成步骤包括:添加MongoDB依赖、配置连接信息、创建数据访问对象(DAO)以及进行数据操作。通过这种方式,开发者可以充分利用两者优势,应对各种数据需求。在实际应用中,结合微服务架构等技术,可以构建高性能、可扩展的系统。掌握MongoDB与Spring Boot集成对于提升开发效率和项目质量至关重要,未来有望在更多领域得到广泛应用。
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
|
5天前
|
Java 测试技术 API
Spring Boot 单元测试 0基础教程
Spring Boot 单元测试 0基础教程
12 0
|
5天前
|
机器学习/深度学习 敏捷开发 监控
深入探索软件测试中的持续集成与持续部署(CI/CD)实践
【5月更文挑战第10天】 在现代软件开发周期中,"持续集成"(CI)与"持续部署"(CD)是提升效率、确保质量的重要环节。本文将详细探讨CI/CD在软件测试中的应用,包括其基本概念、实施策略、工具应用及面临的挑战。不同于一般性概述,本文将重点分析如何优化测试流程以适应CI/CD环境,并提出针对性的改进措施。通过实际案例分析,揭示成功实施CI/CD的最佳实践,并讨论如何在不断变化的技术环境中保持测试策略的前瞻性和灵活性。
|
5天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通

热门文章

最新文章