Spring+SpringMVC+MyBatis+easyUI整合進(jìn)階篇(十二)Spring集成Redis緩存

作者: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");
    }
put-string
    @Test
    public void redisGetTest() {
        //獲取
        String str = (String) redisUtil.get("name", String.class);
        System.out.println(str);
    }

測(cè)試結(jié)果如下:


get-string
  • 然后是復(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);
    }
put-list
    @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é)果如下:


get-list
  • 最后是項(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
exception
 @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);
    }
put-article
@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é)果如下:


get-article

總結(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

image

如果有問(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)目文檔幅虑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丰滑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翘单,更是在濱河造成了極大的恐慌吨枉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哄芜,死亡現(xiàn)場(chǎng)離奇詭異貌亭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)认臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門圃庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人失晴,你說(shuō)我怎么就攤上這事剧腻。” “怎么了涂屁?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵书在,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拆又,道長(zhǎng)儒旬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任帖族,我火速辦了婚禮栈源,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竖般。我一直安慰自己甚垦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布涣雕。 她就那樣靜靜地躺著艰亮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胞谭。 梳的紋絲不亂的頭發(fā)上垃杖,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音丈屹,去河邊找鬼调俘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旺垒,可吹牛的內(nèi)容都是我干的彩库。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼先蒋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇钦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起竞漾,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眯搭,失蹤者是張志新(化名)和其女友劉穎窥翩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞仙,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寇蚊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棍好。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗岸。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖借笙,靈堂內(nèi)的尸體忽然破棺而出扒怖,到底是詐尸還是另有隱情,我是刑警寧澤业稼,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布盗痒,位于F島的核電站,受9級(jí)特大地震影響盼忌,放射性物質(zhì)發(fā)生泄漏积糯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一谦纱、第九天 我趴在偏房一處隱蔽的房頂上張望看成。 院中可真熱鬧,春花似錦跨嘉、人聲如沸川慌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梦重。三九已至,卻和暖如春亮瓷,著一層夾襖步出監(jiān)牢的瞬間琴拧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工嘱支, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓胸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓除师,卻偏偏與公主長(zhǎng)得像沛膳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汛聚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容