redis和spring集成(注解实现,方便,快捷)

redis和spring集成(注解实现,方便,快捷)

http://blog.csdn.net/fighterandknight/article/details/53432276/

前言:

         spring和redis集成有很多方式,看到网上很多都是使用redistemplate自己去做redis 的一些操作,但是对于我们开发来说,肯定是使用越方便越好,于是乎就有了spring的对redis或者memcahe这些换成框架的封装,只需要引入spring的spring-data-redis的jar。 

         好了,废话不多说,我们开始上代码。

工程目录结构

        我们先预览一下这个项目的工程目录结构先:

启动redis

        还没安装的redis 的同学可以自己去安装redis,我自己是在window上安装的,其实也不是安装,解压一下就可以使用了,不过需要注意的是它的启动方式,直接点击redis-server启动会直接闪退的,正确的启动方式使用命令【redis-server.exe  redis.windows.conf】,详细请参考:Windows 64位下安装Redis详细教程

创建数据库

配置pom文件

pom文件就没什么好说的了,直接贴配置给大家吧

[html] view plain copy
 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>ylink.com</groupId>  
  5.     <artifactId>spring-redis-test</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.     <packaging>war</packaging>  
  8.     <build />  
  9.   
  10.     <properties>  
  11.         <spring.version>4.2.6.RELEASE</spring.version>  
  12.         <slf4j.version>1.6.4</slf4j.version>  
  13.         <logback.version>1.0.0</logback.version>  
  14.         <junit.version>4.9</junit.version>  
  15.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  16.     </properties>  
  17.   
  18.     <dependencies>  
  19.         <!-- spring -->  
  20.         <dependency>  
  21.             <groupId>org.springframework</groupId>  
  22.             <artifactId>spring-core</artifactId>  
  23.             <version>${spring.version}</version>  
  24.             <exclusions>  
  25.                 <exclusion>  
  26.                     <groupId>commons-logging</groupId>  
  27.                     <artifactId>commons-logging</artifactId>  
  28.                 </exclusion>  
  29.             </exclusions>  
  30.         </dependency>  
  31.         <dependency>  
  32.             <groupId>org.springframework</groupId>  
  33.             <artifactId>spring-beans</artifactId>  
  34.             <version>${spring.version}</version>  
  35.         </dependency>  
  36.         <dependency>  
  37.             <groupId>org.springframework</groupId>  
  38.             <artifactId>spring-webmvc</artifactId>  
  39.             <version>${spring.version}</version>  
  40.         </dependency>  
  41.         <dependency>  
  42.             <groupId>org.springframework</groupId>  
  43.             <artifactId>spring-context</artifactId>  
  44.             <version>${spring.version}</version>  
  45.         </dependency>  
  46.         <dependency>  
  47.             <groupId>org.springframework</groupId>  
  48.             <artifactId>spring-context-support</artifactId>  
  49.             <version>${spring.version}</version>  
  50.         </dependency>  
  51.         <dependency>  
  52.             <groupId>org.springframework</groupId>  
  53.             <artifactId>spring-expression</artifactId>  
  54.             <version>${spring.version}</version>  
  55.         </dependency>  
  56.         <dependency>  
  57.             <groupId>org.springframework</groupId>  
  58.             <artifactId>spring-orm</artifactId>  
  59.             <version>${spring.version}</version>  
  60.         </dependency>  
  61.         <dependency>  
  62.             <groupId>org.springframework</groupId>  
  63.             <artifactId>spring-aop</artifactId>  
  64.             <version>${spring.version}</version>  
  65.         </dependency>  
  66.         <dependency>  
  67.             <groupId>org.springframework</groupId>  
  68.             <artifactId>spring-test</artifactId>  
  69.             <version>${spring.version}</version>  
  70.             <scope>test</scope>  
  71.         </dependency>  
  72.         <dependency>  
  73.             <groupId>org.mybatis</groupId>  
  74.             <artifactId>mybatis-spring</artifactId>  
  75.             <version>1.1.1</version>  
  76.         </dependency>  
  77.         <!-- junit -->  
  78.         <dependency>  
  79.             <groupId>junit</groupId>  
  80.             <artifactId>junit</artifactId>  
  81.             <version>${junit.version}</version>  
  82.             <scope>test</scope>  
  83.         </dependency>  
  84.   
  85.         <!-- memcached <dependency<groupId>com.whalin</groupId<artifactId>Memcached-Java-Client</artifactId>   
  86.             <version>3.0.1</version</dependency> -->  
  87.         <dependency>  
  88.             <groupId>commons-lang</groupId>  
  89.             <artifactId>commons-lang</artifactId>  
  90.             <version>2.6</version>  
  91.         </dependency>  
  92.         <dependency>  
  93.             <groupId>org.mybatis</groupId>  
  94.             <artifactId>mybatis</artifactId>  
  95.             <version>3.2.2</version>  
  96.         </dependency>  
  97.         <!-- log -->  
  98.         <dependency>  
  99.             <groupId>org.slf4j</groupId>  
  100.             <artifactId>slf4j-api</artifactId>  
  101.             <version>${slf4j.version}</version>  
  102.         </dependency>  
  103.         <dependency>  
  104.             <groupId>ch.qos.logback</groupId>  
  105.             <artifactId>logback-classic</artifactId>  
  106.             <version>${logback.version}</version>  
  107.             <scope>test</scope>  
  108.         </dependency>  
  109.         <dependency>  
  110.             <groupId>commons-logging</groupId>  
  111.             <artifactId>commons-logging</artifactId>  
  112.             <version>1.1.1</version>  
  113.         </dependency>  
  114.         <dependency>  
  115.             <groupId>redis.clients</groupId>  
  116.             <artifactId>jedis</artifactId>  
  117.             <version>2.8.1</version>  
  118.         </dependency>  
  119.         <dependency>  
  120.             <groupId>org.springframework.data</groupId>  
  121.             <artifactId>spring-data-redis</artifactId>  
  122.             <version>1.7.2.RELEASE</version>  
  123.         </dependency>  
  124.         <dependency>  
  125.             <groupId>mysql</groupId>  
  126.             <artifactId>mysql-connector-java</artifactId>  
  127.             <version>5.1.31</version>  
  128.         </dependency>  
  129.         <dependency>  
  130.             <groupId>com.jolbox</groupId>  
  131.             <artifactId>bonecp</artifactId>  
  132.             <version>0.7.1.RELEASE</version>  
  133.         </dependency>  
  134.     </dependencies>  
  135. </project>  



配置spring文件

 
下面是spring-mvc.xml的配置
[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    
  4.     xmlns:context="http://www.springframework.org/schema/context"    
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"    
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  7.                         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd      
  8.                         http://www.springframework.org/schema/context      
  9.                         http://www.springframework.org/schema/context/spring-context-4.2.xsd      
  10.                         http://www.springframework.org/schema/mvc      
  11.                         http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">  
  12.     <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->    
  13.     <context:component-scan base-package="com.cn" />    
  14.       
  15.     <!-- 引入同文件夹下的redis属性配置文件 -->  
  16.     <import resource="spring-redis.xml"/>  
  17.       
  18.     <import resource="spring-datasource-bonecp.xml"/>  
  19.       
  20.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  21.          <property name="basePackage" value="com.cn.dao"/>   
  22.      </bean>  
  23.       
  24. </beans>    


下面是spring-redis.xml的配置
[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    
  4.     xmlns:context="http://www.springframework.org/schema/context"    
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"    
  6.     xmlns:cache="http://www.springframework.org/schema/cache"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  8.                         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd      
  9.                         http://www.springframework.org/schema/context      
  10.                         http://www.springframework.org/schema/context/spring-context-4.2.xsd      
  11.                         http://www.springframework.org/schema/mvc      
  12.                         http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd  
  13.                         http://www.springframework.org/schema/cache   
  14.                         http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">   
  15.       
  16.     <context:property-placeholder location="classpath:redis-config.properties" />    
  17.   
  18.     <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->    
  19.     <cache:annotation-driven cache-manager="cacheManager" />    
  20.       
  21.      <!-- redis 相关配置 -->    
  22.      <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">    
  23.          <property name="maxIdle" value="${redis.maxIdle}" />     
  24.          <property name="maxWaitMillis" value="${redis.maxWait}" />    
  25.          <property name="testOnBorrow" value="${redis.testOnBorrow}" />    
  26.      </bean>    
  27.   
  28.      <bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"    
  29.        p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>    
  30.     
  31.      <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">    
  32.          <property name="connectionFactory" ref="JedisConnectionFactory" />    
  33.      </bean>    
  34.       
  35.      <!-- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value -->    
  36.      <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">    
  37.          <property name="caches">    
  38.             <set>    
  39.                 <!-- 这里可以配置多个redis -->  
  40.                 <!-- <bean class="com.cn.util.RedisCache">    
  41.                      <property name="redisTemplate" ref="redisTemplate" />    
  42.                      <property name="name" value="default"/>    
  43.                 </bean> -->    
  44.                 <bean class="com.cn.util.RedisCache">    
  45.                      <property name="redisTemplate" ref="redisTemplate" />    
  46.                      <property name="name" value="common"/>    
  47.                      <!-- common名称要在类或方法的注解中使用 -->  
  48.                 </bean>  
  49.             </set>    
  50.          </property>    
  51.      </bean>    
  52.       
  53. </beans>    
 
下面是spring-datasource-bonecp.xml配置
[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:task="http://www.springframework.org/schema/task"  
  5.     xmlns:util="http://www.springframework.org/schema/util"  
  6.     xmlns:p="http://www.springframework.org/schema/p"  
  7.     xmlns:aop="http://www.springframework.org/schema/aop"  
  8.     xmlns:tx="http://www.springframework.org/schema/tx"  
  9.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  10.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd  
  11.         http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd  
  12.         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd  
  13.         http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
  14.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">  
  15.   
  16.     <!--用于连接boneCp数据源 -->  
  17.     <bean id="commonDataSourceConfig" class="com.jolbox.bonecp.BoneCPDataSource" abstract="true" destroy-method="close">  
  18.         <!-- 每个分区最大的连接数 -->    
  19.         <property name="maxConnectionsPerPartition" value="100" />    
  20.         <!-- 每个分区最小的连接数 -->    
  21.         <property name="minConnectionsPerPartition" value="10" />    
  22.         <!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定-->    
  23.         <property name="partitionCount" value="3" />    
  24.         <!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->    
  25.         <property name="acquireIncrement" value="2" />  
  26.         <!-- 测试连接有效性的间隔时间,单位分钟     
  27.         <property name="idleConnectionTestPeriod" value="40" />-->  
  28.         <!-- 空闲存活时间 分钟  
  29.         <property name="idleMaxAge" value="10"/>-->  
  30.         <!-- 连接超时时间 毫秒-->  
  31.         <property name="connectionTimeout" value="10000"/>  
  32.     </bean>  
  33.    
  34.     <!-- 数据源配置 -->  
  35.     <bean id="dataSource" parent="commonDataSourceConfig">  
  36.         <property name="driverClass" value="com.mysql.jdbc.Driver" />  
  37.           
  38.         <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test" />  
  39.         <property name="username" value="root"/>  
  40.         <property name="password" value=""/>  
  41.     </bean>    
  42.    
  43.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  44.         <property name="configLocation" value="classpath:cfg.xml"/>  
  45.         <property name="dataSource" ref="dataSource"/>  
  46.     </bean>  
  47. </beans>  


编写java类

直接上service,其他的大家可以自己去我上传的源码去下载查看,至于对spring的缓存的注解不太了解怎么使用的,可以参考下这边博客园博主写的博文:Spring Cache使用详解

[java] view plain copy
 
  1. package com.cn.service;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.cache.annotation.CacheEvict;  
  5. import org.springframework.cache.annotation.CachePut;  
  6. import org.springframework.cache.annotation.Cacheable;  
  7. import org.springframework.stereotype.Service;  
  8.   
  9. import com.cn.bean.User;  
  10. import com.cn.dao.UserDao;  
  11.   
  12. /** 
  13.  * @类名称: UserServiceImpl 
  14.  * @类描述:  
  15.  * @创建人: 1603254 
  16.  * @创建时间: 2016-12-2 上午11:10:33 
  17.  * 
  18.  * @修改人: 1603254 
  19.  * @操作时间: 2016-12-2 上午11:10:33 
  20.  * @操作原因:  
  21.  *  
  22.  */  
  23. @Service  
  24. public class UserServiceImpl implements UserService{  
  25.   
  26.     @Autowired  
  27.     private UserDao userDao;  
  28.   
  29.     @Cacheable(value="common",key="'id_'+#id")  
  30.     public User selectByPrimaryKey(Integer id) {  
  31.         System.out.println("======================");  
  32.         System.out.println("======================");  
  33.         System.out.println("======================");  
  34.         return userDao.selectByPrimaryKey(id);  
  35.     }  
  36.       
  37.     @CachePut(value="common",key="#user.getUserName()")  
  38.     public void insertSelective(User user) {  
  39. //      userDao.insertSelective(user);  
  40.         System.out.println("########################");  
  41.         System.out.println("########################");  
  42.         System.out.println("########################");  
  43.     }  
  44.   
  45.     @CacheEvict(value="common",key="'id_'+#id")  
  46.     public void deleteByPrimaryKey(Integer id) {  
  47. //      userDao.deleteByPrimaryKey(id);  
  48.         System.out.println("******************************");  
  49.         System.out.println("******************************");  
  50.         System.out.println("******************************");  
  51.     }  
  52. }  



编写mybatis配置文件

下面是cfg.xml配置文件
[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>    
  2. <!DOCTYPE configuration    
  3.   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"    
  4.   "http://mybatis.org/dtd/mybatis-3-config.dtd">    
  5. <configuration>    
  6.      <!-- mapping 文件路径配置 -->    
  7.      <mappers>    
  8.         <mapper resource="mapper/UserMapper.xml" />    
  9.     </mappers>    
  10.      <!-- <plugins>  
  11.         <plugin interceptor="com.github.pagehelper.PageHelper">  
  12.             <property name="dialect" value="oracle"/>  
  13.             该参数默认为false  
  14.             设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用  
  15.             和startPage中的pageNum效果一样  
  16.             <property name="offsetAsPageNum" value="true"/>  
  17.             该参数默认为false  
  18.             设置为true时,使用RowBounds分页会进行count查询  
  19.             <property name="rowBoundsWithCount" value="true"/>  
  20.             设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果  
  21.             (相当于没有执行分页查询,但是返回结果仍然是Page类型)  
  22.             <property name="pageSizeZero" value="true"/>  
  23.             启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页  
  24.             禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据  
  25.             <property name="reasonable" value="true"/>  
  26.             增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值  
  27.             可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值  
  28.             <property name="params" value="pageNum=start;pageSize=limit;pageSizeZero=zero;reasonable=heli;count=contsql"/>  
  29.         </plugin>  
  30.     </plugins>  
  31.  -->  
  32. </configuration>  

下面是UserMapper.xml配置

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <mapper namespace="com.cn.dao.UserDao" >  
  4.     
  5.   <resultMap id="resultMap" type="com.cn.bean.User" >  
  6.         <result column="id" property="id" jdbcType="CHAR" />  
  7.         <result column="name" property="name" jdbcType="CHAR" />  
  8.   </resultMap>  
  9. <!--添加-->   
  10.  <insert id="insertSelective"  parameterType="com.cn.bean.User">  
  11.  insert into user(id,name) values(#{id,jdbcType=CHAR},#{name,jdbcType=VARCHAR})  
  12.  </insert>  
  13. <!--查询-->  
  14.  <select id="selectByPrimaryKey"  resultMap="resultMap">  
  15.     select * from user where id=#{id}  
  16.  </select>  
  17. <!--删除-->  
  18.  <select id="deleteByPrimaryKey"  resultMap="resultMap">  
  19.     delete   from user where id=#{id}  
  20.  </select>  
  21. </mapper>  




配置web.xml

[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">  
  3. <web-app id="WebApp_ID">  
  4.     <display-name>spring-redis-test</display-name>  
  5.     <welcome-file-list>  
  6.         <welcome-file>index.html</welcome-file>  
  7.         <welcome-file>index.htm</welcome-file>  
  8.         <welcome-file>index.jsp</welcome-file>  
  9.         <welcome-file>default.html</welcome-file>  
  10.         <welcome-file>default.htm</welcome-file>  
  11.         <welcome-file>default.jsp</welcome-file>  
  12.     </welcome-file-list>  
  13.   
  14.   
  15.     <servlet>  
  16.         <servlet-name>SpringMVC</servlet-name>  
  17.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  18.         <init-param>  
  19.             <param-name>contextConfigLocation</param-name>  
  20.             <param-value>classpath:spring-mvc.xml</param-value>  
  21.         </init-param>  
  22.         <load-on-startup>1</load-on-startup>  
  23.         <async-supported>true</async-supported>  
  24.     </servlet>  
  25. </web-app>  



编写测试用例

[java] view plain copy
 
  1. import org.springframework.beans.factory.annotation.Autowired;  
  2. import org.springframework.test.context.ContextConfiguration;  
  3. import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;  
  4.   
  5. import com.cn.bean.User;  
  6. import com.cn.service.UserService;  
  7.   
  8.   
  9. @ContextConfiguration(locations="classpath:spring-mvc.xml")  
  10. public class Test extends AbstractJUnit4SpringContextTests {  
  11.   
  12.     @Autowired  
  13.     private UserService userService;  
  14.       
  15.       
  16.       
  17.     @org.junit.Test  
  18.     public void  add(){  
  19.         User user=new User();  
  20.         user.setName("wen");  
  21.         user.setId("1");  
  22.         userService.insertSelective(user);  
  23.     }  
  24.       
  25.       
  26.     @org.junit.Test  
  27.     public void  query(){  
  28.         User user=userService.selectByPrimaryKey(1);  
  29.         System.out.println(user.toString());  
  30.     }  
  31. }  
上面我是这样执行校验的: 
1)先把数据库的操作打开,插入一条数据,插入的时候,数据库会插入一条数据,redis里面也会有一条数据。
2)然后执行查询的测试用例,查询的时候注释掉查询的数据库操作,直接从redis里面去查询,你可以可以把数据库的数据删掉,一样还可以从redis里面查询出来
 
上面代码我都测试过,无措执行,有问题大家可以提出来讨论一下,谢谢~
 

源代码下载

下载地址是:spring-redis项目集成demo下载地址

其实说实话,用起来还是蛮简单的,而且方便,快捷,真正想要了解深入一点的话,还是建议有时间去看看源代码。

原文地址:https://www.cnblogs.com/handsome1013/p/7940435.html