作者:13
GItHub:https://github.com/ZHENFENG13
版權(quán)聲明:本文為原創(chuàng)文章芬首,未經(jīng)允許不得轉(zhuǎn)載。
整合Redis
本來(lái)以為類似的Redis教程和整合代碼應(yīng)該會(huì)很多为障,因此也沒(méi)打算特別認(rèn)真的做這個(gè)教程涝滴,但是看了一下網(wǎng)上類似的教程好像不是特別多,剛好也要在perfect-ssm項(xiàng)目中整合Redis恶迈,因此花了兩天時(shí)間做了整合和測(cè)試臣咖,并整理在這篇文章中跃捣,希望給看到教程的朋友一些幫助。
pom.xml依賴安裝
<!-- 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+Redis集成代碼
有兩種集成方式夺蛇,一種是通過(guò)Spring
配置文件疚漆,另外一種是通過(guò)繼承CachingConfigurerSupport
,兩種方式雖然方式不同刁赦,但是目的和結(jié)果是一樣的娶聘。
方式一:
RedisCacheConfig.java
@Component
@EnableCaching
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
//ip地址
redisConnectionFactory.setHostName("127.0.0.1");
//端口號(hào)
redisConnectionFactory.setPort(17779);
//redis登錄密碼
redisConnectionFactory.setPassword("ILfr6LTKhpNJ0x5i");
//database 默認(rèn)是16個(gè),不設(shè)置的話默認(rèn)為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);
//默認(rèn)過(guò)期時(shí)間
cacheManager.setDefaultExpiration(3000);
return cacheManager;
}
}
完成后要將bean
注入到Spring中甚脉,因此需要在spring-context.xml
配置文件中添加如下配置:
<context:component-scan base-package="com.ssm.promotion.core.redis"/>
perfect-ssm項(xiàng)目中用到的是此方法丸升,本文中后續(xù)的測(cè)試用例代碼中也是根據(jù)這種方式來(lái)測(cè)試的,代碼已經(jīng)上傳至github倉(cāng)庫(kù)牺氨,源碼可以到我的github倉(cāng)庫(kù)中查看和下載狡耻。
方式二:
redis.properties
#ip地址
redis.host=127.0.0.1
#端口號(hào)
redis.port=17779
#密碼
redis.password=ILfr6LTKhpNJ0x5i
#最大空閑數(shù)墩剖,數(shù)據(jù)庫(kù)連接的最大空閑時(shí)間。超過(guò)空閑時(shí)間夷狰,數(shù)據(jù)庫(kù)連接將被標(biāo)記為不可用岭皂,然后被釋放。設(shè)為0表示無(wú)限制沼头。
redis.maxIdle=200
#連接池的最大數(shù)據(jù)庫(kù)連接數(shù)爷绘。設(shè)為0表示無(wú)限制
redis.maxActive=300
#最大建立連接等待時(shí)間。如果超過(guò)此時(shí)間將接到異常瘫证。設(shè)為-1表示無(wú)限制揉阎。
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>
<!-- 即使沒(méi)有設(shè)置密碼,password可以不設(shè)置值,但這項(xiàng)設(shè)置一定要保留 -->
<property name="password" value="${redis.password}"></property>
<!-- 即使沒(méi)有設(shè)置密碼,password可以不設(shè)置值背捌,但這項(xiàng)設(shè)置一定要保留 -->
<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>
<!--開啟事務(wù)-->
<property name="enableTransactionSupport" value="true"/>
</bean>
</beans>
注意事項(xiàng):
如果在安裝redis時(shí)沒(méi)有設(shè)置密碼,配置文件中的password可以不設(shè)置值毙籽,但是這項(xiàng)設(shè)置一定要保留:
<property name="password" value=""></property>
如若不然的話,項(xiàng)目在啟動(dòng)時(shí)會(huì)報(bào)錯(cuò)毡庆,無(wú)法連接redis坑赡,沒(méi)有特別去研究為什么會(huì)這樣,但是需要注意么抗。
RedisUtil
由于采用的是第一種方式毅否,在測(cè)試的時(shí)候又寫了一個(gè)Redis的工具類,RedisUtil:
/**
* Created by 13 on 2017/12/4.
*/
@Component
public class RedisUtil {
private static final String CACHE_NAME = "perfect-ssm-cache:";
// 過(guò)期時(shí)間
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);
}
}
整合測(cè)試
測(cè)試用例代碼:
- 首先是簡(jiǎn)單的
String
測(cè)試:
@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);
}
測(cè)試結(jié)果如下:
- 然后是復(fù)雜類型
java.util.List
測(cè)試:
@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);
}
}
}
測(cè)試結(jié)果如下:
- 最后是項(xiàng)目中自定義的JavaBean的測(cè)試:
要緩存的JavaBean必須實(shí)現(xiàn)Serializable接口蝇刀,因?yàn)镾pring會(huì)將對(duì)象先序列化再存入 Redis螟加,如測(cè)試用例中的com.ssm.promotion.core.entity.Article
類,如果不實(shí)現(xiàn) Serializable的話將會(huì)報(bào)出如下異常:
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);
}
}
}
測(cè)試結(jié)果如下:
總結(jié)
配置文件中的密碼吞琐、端口捆探、ip地址要改成你自己的配置,不要直接用這里的配置站粟,如果是這個(gè)原因?qū)е马?xiàng)目報(bào)錯(cuò)就很尷尬了黍图。
每周抽出一些時(shí)間做點(diǎn)事情,雖然感覺(jué)很壓抑奴烙,但是看到結(jié)果的時(shí)候心里真的是樂(lè)開了花助被。
首發(fā)于我的個(gè)人博客,新的項(xiàng)目演示地址:perfect-ssm,登錄賬號(hào):admin,密碼:123456
如果有問(wèn)題或者有一些好的創(chuàng)意切诀,歡迎給我留言揩环,也感謝向我指出項(xiàng)目中存在問(wèn)題的朋友。
如果你想繼續(xù)了解該項(xiàng)目可以查看整個(gè)系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub倉(cāng)庫(kù)或者開源中國(guó)代碼倉(cāng)庫(kù)中查看源碼及項(xiàng)目文檔幅虑。