redis-cluster和Spring集成,基于Cache注解

来源:互联网 发布:土木工程设计软件 编辑:程序博客网 时间:2024/06/05 21:07

【参考文章】http://blog.csdn.net/fengyong7723131/article/details/52995592

前言:

redis-cluster实现了缓存分布式和备份,搭建起来特别简单,没搭建的可以看一下redis-cluster集群搭建这篇博客,下面是一些主要的配置文件,如果复制跑不起来的朋友可以直接下载我搞好的完整项目,是一个maven项目,下载地址:http://download.csdn.net/detail/qq_34021712/9822630


pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.redis</groupId>  <artifactId>redis-spring</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>war</packaging>  <!-- 依赖管理 --><dependencies><!-- 时间操作组件 --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.5</version></dependency><!-- Apache工具组件 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.apache.commons</groupId>    <artifactId>commons-io</artifactId>    <version>1.3.2</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.3</version></dependency><!-- Jackson Json处理工具包 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.2</version></dependency><!-- httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.5</version></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- 日志处理 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.4</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.2.6.RELEASE</version></dependency><!-- 编译程序用的 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!-- Redis客户端 --><dependency><groupId>redis.clients</groupId> <artifactId>jedis</artifactId><version>2.9.0</version></dependency><!-- redis Spring 基于注解配置 -->         <dependency>    <groupId>org.springframework.data</groupId>    <artifactId>spring-data-redis</artifactId>    <version>1.8.1.RELEASE</version>  </dependency><!-- Mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.2.8</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><dependency><groupId>com.github.miemiedev</groupId><artifactId>mybatis-paginator</artifactId><version>1.2.15</version></dependency><!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.9</version></dependency></dependencies>  <build>  <plugins>  <plugin>  <artifactId>maven-war-plugin</artifactId>  <configuration>  <version>3.0</version>  </configuration>  </plugin>  <!-- java编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding></configuration></plugin>  </plugins>  </build></project>


applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 数据库连接池 --><!-- 加载配置文件 --><context:property-placeholder location="classpath:properties/*.properties" /><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="driverClassName" value="${jdbc.driver}" /><property name="maxActive" value="10" /><property name="minIdle" value="5" /></bean><!-- 配置sqlsessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property><property name="dataSource" ref="dataSource"></property></bean><!-- 配置扫描包,加载mapper代理对象 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.redis.mapper"></property></bean></beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 扫描包加载Service实现类 --><context:component-scan base-package="com.redis.service"></context:component-scan><!-- 事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 数据源 --><property name="dataSource" ref="dataSource" /></bean><!-- 通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 传播行为 --><tx:method name="save*" propagation="REQUIRED" /><tx:method name="insert*" propagation="REQUIRED" /><tx:method name="add*" propagation="REQUIRED" /><tx:method name="create*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="find*" propagation="SUPPORTS" read-only="true" /><tx:method name="select*" propagation="SUPPORTS" read-only="true" /><tx:method name="get*" propagation="SUPPORTS" read-only="true" /></tx:attributes></tx:advice><!-- 切面 --><aop:config><aop:advisor advice-ref="txAdvice"pointcut="execution(* com.redis.service.*.*(..))" /></aop:config></beans>

applicationContext-redis.xml
<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"        xmlns:context="http://www.springframework.org/schema/context"        xmlns:mvc="http://www.springframework.org/schema/mvc"        xmlns:cache="http://www.springframework.org/schema/cache"      xsi:schemaLocation="http://www.springframework.org/schema/beans                              http://www.springframework.org/schema/beans/spring-beans-4.2.xsd                              http://www.springframework.org/schema/context                              http://www.springframework.org/schema/context/spring-context-4.2.xsd                              http://www.springframework.org/schema/mvc                              http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd                          http://www.springframework.org/schema/cache                           http://www.springframework.org/schema/cache/spring-cache-4.2.xsd"><!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->        <cache:annotation-driven cache-manager="cacheManager" /><!-- 引入配置文件 -->      <bean id="propertyConfigurer"  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">          <property name="location" value="classpath:properties/redis.properties" />      </bean>        <!-- jedis 配置-->      <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >          <!--最大空闲数-->          <property name="maxIdle" value="${redis.maxIdle}" />          <!--最大建立连接等待时间-->          <property name="maxWaitMillis" value="${redis.maxWait}" />          <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->          <property name="testOnBorrow" value="${redis.testOnBorrow}" />      </bean >        <!--配置文件加载-->      <bean id="resourcePropertySource" class="org.springframework.core.io.support.ResourcePropertySource">          <constructor-arg name="name" value="redis.properties"/>          <constructor-arg name="resource" value="classpath:properties/redis.properties"/>      </bean><!--redisCluster配置-->      <bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">          <constructor-arg name="propertySource" ref="resourcePropertySource"/>      </bean>          <!-- redis服务器中心 -->      <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >         <constructor-arg name="clusterConfig" ref="redisClusterConfiguration"/>          <constructor-arg name="poolConfig" ref="poolConfig"/>          <property name="password" value="${redis.password}" />          <property name="timeout" value="${redis.timeout}" ></property>      </bean >      <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >          <property name="connectionFactory" ref="connectionFactory" />          <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->          <property name="keySerializer" >              <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />          </property>          <property name="valueSerializer" >              <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />          </property>          <property name="hashKeySerializer">              <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>          </property>          <property name="hashValueSerializer">              <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>          </property>      </bean >              <!-- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value -->         <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">             <property name="caches">                <set>                    <!-- 这里可以配置多个redis -->                  <bean class="com.redis.redis.RedisCache">                         <property name="redisTemplate" ref="redisTemplate" />                         <property name="name" value="defaultCache"/>                    </bean>                </set>             </property>         </bean></beans>

web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="taotao" version="2.5"><display-name>redis-spring</display-name><!-- 指定监听器加载的log4j配置文件 -->  <context-param>      <param-name>log4j</param-name>      <param-value>classpath:log4j.properties</param-value>  </context-param><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 解决post乱码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- springmvc的前端控制器 --><servlet><servlet-name>redis-spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>redis-spring</servlet-name><url-pattern>/rest/*</url-pattern></servlet-mapping></web-app>

RedisCache.java
package com.redis.redis;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import org.springframework.cache.Cache;import org.springframework.cache.support.SimpleValueWrapper;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;public class RedisCache implements Cache {private RedisTemplate<String, Object> redisTemplate;private String name;public RedisTemplate<String, Object> getRedisTemplate() {return redisTemplate;}public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}public void setName(String name) {this.name = name;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn this.name;}@Overridepublic Object getNativeCache() {// TODO Auto-generated method stubreturn this.redisTemplate;}@Overridepublic ValueWrapper get(Object key) {// TODO Auto-generated method stubfinal String keyf = (String) key;Object object = null;object = redisTemplate.execute(new RedisCallback<Object>() {public Object doInRedis(RedisConnection connection)throws DataAccessException {byte[] key = keyf.getBytes();byte[] value = connection.get(key);if (value == null) {return null;}return toObject(value);}});return (object != null ? new SimpleValueWrapper(object) : null);}@Overridepublic void put(Object key, Object value) {// TODO Auto-generated method stubfinal String keyf = (String) key;final Object valuef = value;final long liveTime = 86400;redisTemplate.execute(new RedisCallback<Long>() {public Long doInRedis(RedisConnection connection)throws DataAccessException {byte[] keyb = keyf.getBytes();byte[] valueb = toByteArray(valuef);connection.set(keyb, valueb);if (liveTime > 0) {connection.expire(keyb, liveTime);}return 1L;}});}/** * 描述 : <Object转byte[]>. <br> * <p> * <使用方法说明> * </p> *  * @param obj * @return */private byte[] toByteArray(Object obj) {byte[] bytes = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();try {ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(obj);oos.flush();bytes = bos.toByteArray();oos.close();bos.close();} catch (IOException ex) {ex.printStackTrace();}return bytes;}/** * 描述 : <byte[]转Object>. <br> * <p> * <使用方法说明> * </p> *  * @param bytes * @return */private Object toObject(byte[] bytes) {Object obj = null;try {ByteArrayInputStream bis = new ByteArrayInputStream(bytes);ObjectInputStream ois = new ObjectInputStream(bis);obj = ois.readObject();ois.close();bis.close();} catch (IOException ex) {ex.printStackTrace();} catch (ClassNotFoundException ex) {ex.printStackTrace();}return obj;}@Overridepublic void evict(Object key) {// TODO Auto-generated method stubfinal String keyf = (String) key;redisTemplate.execute(new RedisCallback<Long>() {public Long doInRedis(RedisConnection connection)throws DataAccessException {return connection.del(keyf.getBytes());}});}@Overridepublic void clear() {// TODO Auto-generated method stubredisTemplate.execute(new RedisCallback<String>() {public String doInRedis(RedisConnection connection)throws DataAccessException {connection.flushDb();return "ok";}});}@Overridepublic <T> T get(Object key, Class<T> type) {// TODO Auto-generated method stubreturn null;}@Overridepublic ValueWrapper putIfAbsent(Object key, Object value) {// TODO Auto-generated method stubreturn null;}}

Controller层和mapper层接口什么的都不在这里说明了,只是查询一下数据库,直接粘贴serviceImpl类
package com.redis.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import com.redis.mapper.StudentMapper;import com.redis.pojo.Student;import com.redis.service.StudentService;@Servicepublic class StudentServiceImpl implements StudentService {@Autowiredprivate StudentMapper studentMapper;@Overridepublic int insert(Student student) {System.out.println("插入方法执行了########");return studentMapper.insert(student);}@Override@CacheEvict(value="defaultCache",key="'student_id_'+#id")public int deleteByPrimaryKey(Long id) {System.out.println("删除方法执行了########");return studentMapper.deleteByPrimaryKey(id);}@Override@CachePut(value="defaultCache",key="'student_id_'+#student.id")public Student updateByPrimaryKey(Student student) {System.out.println("修改方法执行了########");studentMapper.updateByPrimaryKey(student);return student;}@Override@Cacheable(value="defaultCache",key="'student_id_'+#id")//#idpublic Student selectByPrimaryKey(Long id) {System.out.println("查询方法执行了########");return studentMapper.selectByPrimaryKey(id);}}

测试已通过
1 0
原创粉丝点击