• 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下载地址

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

  • 相关阅读:
    题解 AT5228 【[ABC162A] Lucky 7】
    题解 P6467 【[COCI2008-2009#6] BUKA】
    2020 Codeforces 愚人节比赛题解 A~D
    题解 AT4251 【[ABC110A] Maximize the Formula】
    题解 AT5638 【November 30】
    题解 AT4164 【[ABC102A] Multiple of 2 and N】
    多项式全家桶
    烂题推荐
    NOIP 2020 游记
    P5048 题解
  • 原文地址:https://www.cnblogs.com/handsome1013/p/7940435.html
Copyright © 2020-2023  润新知