Redis学习之与Spring整合开发

Posted 星河scorpion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习之与Spring整合开发相关的知识,希望对你有一定的参考价值。

在网上看了Redis整合Spring的文章,都是加入了spring配置的代码,很冗余,让读者不易理解。

本篇就不贴出配置Spring的代码,直接给出与Redis相关配置及代码,建立在Spring项目已经配置好的基础上。

 

第一步:引入jar包

需要引入和Redis 相关的两个jar包,一个是spring-data-redis.jar,另一个是jedis.jar。

具体的jar包在maven中心库里面都能找到。

maven项目pom.xml的配置:

 

 
  1. <!-- redis缓存 -->

  2. <dependency>

  3. <groupId>org.springframework.data</groupId>

  4. <artifactId>spring-data-redis</artifactId>

  5. <version>1.3.4.RELEASE</version>

  6. </dependency>

  7. <dependency>

  8. <groupId>redis.clients</groupId>

  9. <artifactId>jedis</artifactId>

  10. <version>2.5.2</version>

  11. </dependency>


第二步:新建RedisCache.class类,自定义Cache。

 

 

 
  1. package com.qcjy.common.cache;

  2.  
  3. import java.io.ByteArrayInputStream;

  4. import java.io.ByteArrayOutputStream;

  5. import java.io.IOException;

  6. import java.io.ObjectInputStream;

  7. import java.io.ObjectOutputStream;

  8.  
  9. import org.apache.log4j.Logger;

  10. import org.springframework.cache.Cache;

  11. import org.springframework.cache.support.SimpleValueWrapper;

  12. import org.springframework.dao.DataAccessException;

  13. import org.springframework.data.redis.connection.RedisConnection;

  14. import org.springframework.data.redis.core.RedisCallback;

  15. import org.springframework.data.redis.core.RedisTemplate;

  16.  
  17.  
  18. /**

  19. * 自定义cache,可以定义一个cache名称和一个缓存失效时间。时间到期会自动更新。在xml中配置。

  20. * <功能详细描述>

  21. *

  22. * @author lcma

  23. * @version [版本号, 2016年9月12日]

  24. * @see [相关类/方法]

  25. * @since [产品/模块版本]

  26. */

  27. public class RedisCache implements Cache

  28. /**

  29. * LOG日志

  30. */

  31. private static final Logger LOGGER = Logger.getLogger(RedisCache.class);

  32.  
  33. private RedisTemplate<String, Object> redisTemplate;

  34.  
  35. /**

  36. * 缓存名称

  37. */

  38. private String name;

  39.  
  40. /**

  41. * 缓存失效时间,时间到了会自动更新

  42. */

  43. private long liveTime = 0;

  44.  
  45. public RedisTemplate<String, Object> getRedisTemplate()

  46. return redisTemplate;

  47.  
  48. public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate)

  49. this.redisTemplate = redisTemplate;

  50.  
  51. public void setName(String name)

  52. this.name = name;

  53.  
  54. @Override

  55. public String getName()

  56. return this.name;

  57.  
  58. @Override

  59. public Object getNativeCache()

  60. return this.redisTemplate;

  61.  
  62. /**

  63. * 获取

  64. */

  65. @Override

  66. public ValueWrapper get(Object key)

  67. final String keyf = (String)key;

  68. Object object = null;

  69. object = redisTemplate.execute(new RedisCallback<Object>()

  70. public Object doInRedis(RedisConnection connection)

  71. throws DataAccessException

  72.  
  73. byte[] key = keyf.getBytes();

  74. byte[] value = connection.get(key);

  75. if (value == null)

  76. return null;

  77. return toObject(value);

  78.  
  79. );

  80. return object != null ? new SimpleValueWrapper(object) : null;

  81.  
  82. /**

  83. * 新建

  84. */

  85. @Override

  86. public void put(Object key, Object value)

  87. final String keyf = (String)key;

  88. final Object valuef = value;

  89.  
  90. redisTemplate.execute(new RedisCallback<Long>()

  91. public Long doInRedis(RedisConnection connection)

  92. throws DataAccessException

  93. byte[] keyb = keyf.getBytes();

  94. byte[] valueb = toByteArray(valuef);

  95. connection.set(keyb, valueb);

  96. if (getLiveTime() > 0)

  97. connection.expire(keyb, getLiveTime());

  98. return 1L;

  99. );

  100.  
  101. /**

  102. * 删除

  103. */

  104. @Override

  105. public void clear()

  106. redisTemplate.execute(new RedisCallback<String>()

  107. public String doInRedis(RedisConnection connection)

  108. throws DataAccessException

  109. connection.flushDb();

  110. return "ok";

  111. );

  112.  
  113. /**

  114. * 描述 : <Object转byte[]>. <br>

  115. * <p>

  116. * <使用方法说明>

  117. * </p>

  118. *

  119. * @param obj

  120. * @return

  121. */

  122. private byte[] toByteArray(Object obj)

  123. byte[] bytes = null;

  124. ByteArrayOutputStream bos = new ByteArrayOutputStream();

  125. try

  126. ObjectOutputStream oos = new ObjectOutputStream(bos);

  127. oos.writeObject(obj);

  128. oos.flush();

  129. bytes = bos.toByteArray();

  130. oos.close();

  131. bos.close();

  132. catch (IOException ex)

  133. LOGGER.error(ex.getMessage(),ex);

  134. return bytes;

  135.  
  136. /**

  137. * 描述 : <byte[]转Object>. <br>

  138. * <p>

  139. * <使用方法说明>

  140. * </p>

  141. *

  142. * @param bytes

  143. * @return

  144. */

  145. private Object toObject(byte[] bytes)

  146. Object obj = null;

  147. try

  148. ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

  149. ObjectInputStream ois = new ObjectInputStream(bis);

  150. obj = ois.readObject();

  151. ois.close();

  152. bis.close();

  153. catch (IOException ex)

  154. LOGGER.error(ex.getMessage(),ex);

  155. catch (ClassNotFoundException ex)

  156. LOGGER.error(ex.getMessage(),ex);

  157. return obj;

  158.  
  159. @Override

  160. public void evict(Object key)

  161. final String keyf = (String)key;

  162. redisTemplate.execute(new RedisCallback<Long>()

  163. public Long doInRedis(RedisConnection connection)

  164. throws DataAccessException

  165. return connection.del(keyf.getBytes());

  166. );

  167.  
  168. @Override

  169. public <T> T get(Object key, Class<T> type)

  170.  
  171. return null;

  172.  
  173. @Override

  174. public ValueWrapper putIfAbsent(Object key, Object value)

  175. return null;

  176.  
  177. public long getLiveTime()

  178. return liveTime;

  179.  
  180. public void setLiveTime(long liveTime)

  181. this.liveTime = liveTime;

  182.  


第三步:新建spring-redis.xml,配置Redis相关信息。

 

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:cache="http://www.springframework.org/schema/cache" xmlns:c="http://www.springframework.org/schema/c"

  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

  5. xsi:schemaLocation="

  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

  7. http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

  8.  
  9. <!-- 开启缓存注解 -->

  10. <cache:annotation-driven cache-manager="cacheManager" />

  11.  
  12. <!-- jedis客户端连接工厂 -->

  13. <bean id="jedisConnectionFactory"

  14. class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"

  15. p:host-name="127.0.0.1" p:port="6379" p:password="123456" />

  16.  
  17. <!-- redisTemplate模板 -->

  18. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"

  19. p:connection-factory-ref="jedisConnectionFactory" />

  20.  
  21. <!-- spring自己的管理器,这里定义了三个缓存位置名称 ,既注解中的value -->

  22. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">

  23. <property name="caches">

  24. <set>

  25. <bean class="com.qcjy.common.cache.RedisCache"> <!-- 短期缓存 1个小时-->

  26. <property name="redisTemplate" ref="redisTemplate" />

  27. <property name="name" value="shortTimeCache" />

  28. <property name="liveTime" value="3600" />

  29. </bean>

  30. <bean class="com.qcjy.common.cache.RedisCache"> <!-- 长期缓存 4个小时-->

  31. <property name="redisTemplate" ref="redisTemplate" />

  32. <property name="name" value="longTimeCache" />

  33. <property name="liveTime" value="14400" />

  34. </bean>

  35. <bean class="com.qcjy.common.cache.RedisCache"> <!-- 永久缓存 -->

  36. <property name="redisTemplate" ref="redisTemplate" />

  37. <property name="name" value="nerverTimeCache" />

  38. <property name="liveTime" value="0" />

  39. </bean>

  40. </set>

  41. </property>

  42. </bean>

  43. </beans>

 

com.qcjy.common.cache.RedisCache 是我的项目自定义cache的类路径,可根据自己项目类路径变换。

 

第四步:在spring配置文件中引入导入上面的redis缓存配置

 

 
  1. <!-- 集成Redis缓存框架 -->

  2. <import resource="spring-redis.xml" />


第五步:在方法上面添加注解

 

 

 
  1. /**

  2. * getProject:根据id获取数据. <br/>

  3. * @author lcma

  4. * @param id

  5. * @return

  6. * @since JDK 1.7

  7. */

  8. @Override

  9. @Cacheable(value = "shortTimeCache", key = "'getProject'+#id")

  10. public Project getProject(String id)

  11. return projectDao.getById(id);


缓存注解有三种,分别是:@CachePut,@Cacheable,@CacheEvict。它们之间的区别下篇再做详解。

 

到此,Redis与Spring整合成功啦,哈哈。

以上是关于Redis学习之与Spring整合开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习之Spring与Mybatis的两种整合方式

Activiti学习之spring boot 与activiti整合

SpringBoot学习之整合Mybatis

Java学习之SpringBoot整合SSM Demo

Spring 学习之二(Spring 和 hibernate 整合)

Spring框架学习之IOC