zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    back-不忘初心,方得始终。讲讲我主场3个月的经历。题外话。
    js中event事件对象的兼容问题以及坐标属性-(clientX clientY;pageX,pageY,offsetX,offsetY)
    布局(左边的div随着右边div的高度变化而变化)
    事件委托如何实现的原理
    寄生组合式继承方法的实现以及原理总结
    封装判断一个字符的后缀名和前缀的方法
    经典的面试题如果不通过其他任何变量实现两个数值类型的变量互相更换值。
    【十次方基础教程(后台)】Dockerfile脚本完成镜像的构建
    【十次方基础教程(后台)】安装并启动RabbitMQ
    【十次方基础教程(后台)】docker下安装head插件来进行Elasticsearch的操作
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/11672915.html
Copyright © 2011-2022 走看看