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


作者:13
GitHub:https://github.com/ZHENFENG13
版權聲明:本文為原創文章,未經允許不得轉載。

整合Redis

本來以為類似的Redis教程和整合代碼應該會很多,因此也沒打算特別認真的做這個教程,但是看了一下網上類似的教程好像不是特別多,剛好也要在perfect-ssm項目中整合Redis,因此花了兩天時間做了整合和測試,並整理在這篇文章中,希望給看到教程的朋友一些幫助。

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集成代碼

有兩種集成方式,一種是通過Spring配置文件,另外一種是通過繼承CachingConfigurerSupport,兩種方式雖然方式不同,但是目的和結果是一樣的。

方式一:

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");
        //端口號
        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配置文件中添加如下配置:

<context:component-scan base-package="com.ssm.promotion.core.redis"/>

perfect-ssm項目中用到的是此方法,本文中后續的測試用例代碼中也是根據這種方式來測試的,代碼已經上傳至github倉庫,源碼可以到我的github倉庫中查看和下載。

方式二:

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,沒有特別去研究為什么會這樣,但是需要注意。

RedisUtil

由於采用的是第一種方式,在測試的時候又寫了一個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");
    }

put-string

    @Test
    public void redisGetTest() {
        //獲取
        String str = (String) redisUtil.get("name", String.class);
        System.out.println(str);
    }

測試結果如下:
get-string

  • 然后是復雜類型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);
    }

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);
            }
        }
    }

測試結果如下:
get-list

  • 最后是項目中自定義的JavaBean的測試:

要緩存的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

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);
            }
        }
    }

測試結果如下:
get-article

總結

配置文件中的密碼、端口、ip地址要改成你自己的配置,不要直接用這里的配置,如果是這個原因導致項目報錯就很尷尬了。

每周抽出一些時間做點事情,雖然感覺很壓抑,但是看到結果的時候心里真的是樂開了花。

首發於我的個人博客,新的項目演示地址:perfect-ssm,登錄賬號:admin,密碼:123456

如果有問題或者有一些好的創意,歡迎給我留言,也感謝向我指出項目中存在問題的朋友。

如果你想繼續了解該項目可以查看整個系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub倉庫或者開源中國代碼倉庫中查看源碼及項目文檔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM