springmvc Cacheable (Redis)

直接使用spring缓存请见:https://www.cnblogs.com/hanjun0612/p/11661340.html

RedisTemplate和StringRedisTemplate配置方法基本一致

废话不多,直接上代码。

 

一,单独创建 spring-redis.xml

看一下我的redis.properties

# Redis settings
redis.host=........
redis.port=6379
redis.password=123
redis.timeOut=10000
redis.pass=
redis.maxTotal=200
redis.maxIdle=50
redis.minIdle=8
redis.maxWaitMillis=10000
redis.testOnBorrow=true
redis.testOnReturn=true
redis.testWhileIdle=true
redis.timeBetweenEvictionRunsMillis=30000
redis.numTestsPerEvictionRun=10
redis.minEvictableIdleTimeMillis=60000
 
redis.database=14

spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-4.3.xsd  
                           http://www.springframework.org/schema/mvc 
                           http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
                           http://www.springframework.org/schema/aop 
                           http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
                           http://www.springframework.org/schema/tx 
                           http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"
                           default-lazy-init="true" >
 
    <!--redis配置  -->
    <bean name="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" lazy-init="true">
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="minIdle" value="${redis.minIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <property name="testOnReturn" value="${redis.testOnReturn}"/>
        <property name="testWhileIdle" value="${redis.testWhileIdle}"/>
        <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"/>
        <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/>
        <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"/>
    </bean>
     <!-- Jedis ConnectionFactory 数据库连接配置-->  
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  
        <property name="hostName" value="${redis.host}" />  
        <property name="port" value="${redis.port}" />
        <property name="password" value="${redis.password}" />
        <property name="database" value="${redis.database}" />
        <property name="poolConfig" ref="jedisPoolConfig" />  
    </bean>
 
    <!-- 将session放入redis -->
    <bean id="redisHttpSessionConfiguration"
         class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="7200" />
        <property name="cookieSerializer" ref="defaultCookieSerializer"/>
    </bean>
 
<!--  StringRedisTemplate 序列化方式  -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"   p:connection-factory-ref="jedisConnectionFactory" >
        <property name="keySerializer" ref="keySerializer"/>
        <property name="valueSerializer" ref="jackson2JsonRedisSerializer"/>
    </bean>
    <bean id="keySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="jackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
 
<!--@Cacheable使用Redis缓存 :  spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value  -->
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <bean class="org.springframework.data.redis.cache.RedisCache">
                    <constructor-arg name="redisOperations" ref="redisTemplate"></constructor-arg>
                    <constructor-arg name="name" value="accessCode"></constructor-arg>
                    <constructor-arg name="prefix" value="Access:"></constructor-arg>
                    <constructor-arg name="expiration" value="600"></constructor-arg>
                </bean>
            </set>
        </property>
    </bean>
</beans>

主要看 redisTemplate 和 cacheManager 这两块。

redisTemplate:我使用了StringRedisTemplate,你们也可以使用RedisTemplate,但是当中的序列化方式,需要自己配置。

而这一块配置的原因,在于@Cacheable使用时,告诉它将对象序列化成string存储。

cacheManager: 这里就是配置使用redis缓存了。除了accessCode作为@Cacheable(value="accessCode"),其他都没什么关系。

PS:

<constructor-arg name="prefix" value="Access:"></constructor-arg>

中的  Access:  代表生成一个Access文件夹

不带冒号“:”的话,就只是单纯的前缀

 

二,配置applicationContext.xml

<!-- 引入属性文件 -->
<bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:properties/env.properties</value>
                <value>classpath:properties/jdbc.properties</value>
                <value>classpath:properties/redis.properties</value>
            </list>
        </property>
    </bean>
 
<!-- 启动缓存 -->
<cache:annotation-driven />

没什么花头,主要是引入配置文件,以及启动缓存。

 

三,使用@Cacheable

@Cacheable(value="accessCode",key="#userId + #menuUrl")
    public PageAccessCode getPageAccessCode(Integer userId, String menuUrl,String curLang){
    return new PageAccessCode();
}

 

四,验证。

1 可以在上面方法打断点,刷新页面后,第二次略过。则代表缓存成功了。

2 可以直接看redis客户端。(记得选择数据库,我选的14)

 

PS:

错误:redis -> 元素 'bean' 必须不含字符 [子级]

按照配置文件,手打一遍!

 

参考文章:

https://blog.csdn.net/u013041642/article/details/80370156

https://blog.csdn.net/lingshaoa/article/details/76999811

https://www.cnblogs.com/yhtboke/p/6429577.html

posted @ 2019-10-14 18:06  正怒月神  阅读(675)  评论(0编辑  收藏  举报