做者:13
GitHub:https://github.com/ZHENFENG13
版權聲明:本文爲原創文章,未經容許不得轉載。html
原本覺得相似的Redis教程和整合代碼應該會不少,所以也沒打算特別認真的作這個教程,可是看了一下網上相似的教程好像不是特別多,恰好也要在perfect-ssm項目中整合Redis,所以花了兩天時間作了整合和測試,並整理在這篇文章中,但願給看到教程的朋友一些幫助。java
<!-- Start: redis --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- End: redis -->
有兩種集成方式,一種是經過Spring
配置文件,另一種是經過繼承CachingConfigurerSupport
,兩種方式雖然方式不一樣,可是目的和結果是同樣的。git
RedisCacheConfig.javagithub
@Component @EnableCaching @Configuration public class RedisCacheConfig extends CachingConfigurerSupport { @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); //ip地址 redisConnectionFactory.setHostName("127.0.0.1"); //端口號 redisConnectionFactory.setPort(17779); //redis登陸密碼 redisConnectionFactory.setPassword("ILfr6LTKhpNJ0x5i"); //database 默認是16個,不設置的話默認爲0 redisConnectionFactory.setDatabase(2); return redisConnectionFactory; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>(); redisTemplate.setConnectionFactory(cf); return redisTemplate; } @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); //默認過時時間 cacheManager.setDefaultExpiration(3000); return cacheManager; } }
完成後要將bean
注入到Spring中,所以須要在spring-context.xml
配置文件中添加以下配置:redis
<context:component-scan base-package="com.ssm.promotion.core.redis"/>
perfect-ssm項目中用到的是此方法,本文中後續的測試用例代碼中也是根據這種方式來測試的,代碼已經上傳至github倉庫,源碼能夠到個人github倉庫中查看和下載。spring
redis.properties數據庫
#ip地址 redis.host=127.0.0.1 #端口號 redis.port=17779 #密碼 redis.password=ILfr6LTKhpNJ0x5i #最大空閒數,數據庫鏈接的最大空閒時間。超過空閒時間,數據庫鏈接將被標記爲不可用,而後被釋放。設爲0表示無限制。 redis.maxIdle=200 #鏈接池的最大數據庫鏈接數。設爲0表示無限制 redis.maxActive=300 #最大創建鏈接等待時間。若是超過此時間將接到異常。設爲-1表示無限制。 redis.maxWait=1500 redis.testOnBorrow=true
spring-redis.xml緩存
<context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/> <!-- redis鏈接池 --> <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxActive}"></property> <property name="maxIdle" value="${redis.maxIdle}"></property> <property name="maxWaitMillis" value="${redis.maxWait}"></property> <property name="testOnBorrow" value="${redis.testOnBorrow}"></property> </bean> <!-- redis鏈接工廠 --> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"></property> <property name="port" value="${redis.port}"></property> <!-- 即便沒有設置密碼,password能夠不設置值,但這項設置必定要保留 --> <property name="password" value="${redis.password}"></property> <!-- 即便沒有設置密碼,password能夠不設置值,但這項設置必定要保留 --> <property name="poolConfig" ref="jedisConfig"></property> </bean> <!-- redis操做模板 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <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="enableTransactionSupport" value="true"/> </bean> </beans>
注意事項:工具
若是在安裝redis時沒有設置密碼,配置文件中的password能夠不設置值,可是這項設置必定要保留:測試
<property name="password" value=""></property>
如若否則的話,項目在啓動時會報錯,沒法鏈接redis,沒有特別去研究爲何會這樣,可是須要注意。
因爲採用的是第一種方式,在測試的時候又寫了一個Redis的工具類,RedisUtil:
/** * Created by 13 on 2017/12/4. */ @Component public class RedisUtil { private static final String CACHE_NAME = "perfect-ssm-cache:"; // 過時時間 private static final int EXPIRE_TIME = 3000; private RedisTemplate template; private RedisCache cache; public RedisUtil() { init(); } public void init() { template = SpringUtil.getBean("redisTemplate");//RedisCacheConfig中定義了 cache = new RedisCache(CACHE_NAME, CACHE_NAME.getBytes(), template, EXPIRE_TIME); } //添加 public void put(String key, Object obj) { cache.put(key, obj); } //獲取 public Object get(String key, Class clazz) { return cache.get(key) == null ? null : cache.get(key, clazz); } //刪除 public void del(String key) { cache.evict(key); } }
測試用例代碼:
String
測試:@Test public void redisPutTest() { //添加 redisUtil.put("name", "perfect-ssm"); }
@Test public void redisGetTest() { //獲取 String str = (String) redisUtil.get("name", String.class); System.out.println(str); }
測試結果以下:
java.util.List
測試:@Test public void redisPutListTest() { List<String> stringList = new ArrayList<>(); stringList.add("github"); stringList.add("13"); stringList.add("cnblog"); stringList.add("perfect-ssm"); //添加 redisUtil.put("stringList", stringList); }
@Test public void redisGetListTest() { //獲取 List<String> stringList = (List<String>) redisUtil.get("stringList", List.class); if (stringList.size() > 0) { for (String string : stringList ) { System.out.println(string); } } }
測試結果以下:
要緩存的JavaBean必須實現Serializable接口,由於Spring會將對象先序列化再存入 Redis,如測試用例中的com.ssm.promotion.core.entity.Article
類,若是不實現 Serializable的話將會報出以下異常:
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: com.ssm.promotion.core.entity.Article
@Test public void redisPutListArticleTest() { List<Article> articles = new ArrayList<>(); Article article1 = new Article(); article1.setId("1"); article1.setArticleContent("article1"); Article article2 = new Article(); article2.setId("2"); article2.setArticleContent("article2"); articles.add(article1); articles.add(article2); //添加 redisUtil.put("articles", articles); }
@Test public void redisGetArticleListTest() { //獲取 List<Article> articles = (List<Article>) redisUtil.get("articles", List.class); if (articles.size() > 0) { for (Article article : articles ) { System.out.println(article); } } }
測試結果以下:
配置文件中的密碼、端口、ip地址要改爲你本身的配置,不要直接用這裏的配置,若是是這個緣由致使項目報錯就很尷尬了。
每週抽出一些時間作點事情,雖然感受很壓抑,可是看到結果的時候內心真的是樂開了花。
首發於個人我的博客,新的項目演示地址:perfect-ssm,登陸帳號:admin,密碼:123456
若是有問題或者有一些好的創意,歡迎給我留言,也感謝向我指出項目中存在問題的朋友。
若是你想繼續瞭解該項目能夠查看整個系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也能夠到個人GitHub倉庫或者開源中國代碼倉庫中查看源碼及項目文檔。