• Atitit spring cache key的生成 与ken生成规范 1. Good key name meth.params 1 1.1. Use epl 的mode but only clss


    Atitit spring cache key的生成 与ken生成规范

    1. Good key name meth.params 1

    1.1. Use epl mode but only clss method ,and single param 1

    1.2. 4、自定义key生成器 1

    1.3. Spring xml cfg 2

    1.4. CacheKeyGeneratorSpring 5

    1. Good key name meth.params

    Good  key gene is class.method as package...

    Param as sub package..

    1.1. Use epl mode but only clss method ,and single param

    1.2. 4、自定义key生成器

    [java] view plain copy

    1. @Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator")  

    2. public ResultDTO method(User user);  

    注意:Spring默认的SimpleKeyGenerator是不会将函数名组合进key中的

     

     

     

    使用@EnableCaching启用Cache注解支持;

    2、实现CachingConfigurer,然后注入需要的cacheManager和keyGenerator;从spring4开始默认的keyGenerator是SimpleKeyGenerator;

     

     

     

    即如果只有一个参数,就使用参数作为key,否则使用SimpleKey作为key。

     

    我们也可以自定义自己的key生成器,然后通过xml风格的<cache:annotation-driven key-generator=""/>或注解风格的CachingConfigurer中指定keyGenerator。 

     

     

     

    <!--  ati cache cfg-->

    <bean id="CacheKeyGeneratorSpringAti" class="com.cnhis.cloudhealth.clinical.util.cache.CacheKeyGeneratorSpring">

            

        </bean>

       <context:annotation-config/>

    <cache:annotation-driven key-generator="CacheKeyGeneratorSpringAti"/>

     

    3. 使用  direct use or ,define the @Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator")  

    If cfg in spring xml..then default use ..

    spring

     

    1.3. Spring xml cfg

    <!--  ati cache cfg-->

    <bean id="CacheKeyGeneratorSpringAti" class="com.cnhis.cloudhealth.clinical.util.cache.CacheKeyGeneratorSpring">

            

        </bean>

       <context:annotation-config/>

    <cache:annotation-driven key-generator="CacheKeyGeneratorSpringAti"/>

    <!--

    <bean id="cacheManager"

                     class="org.springframework.cache.concurrent.ConcurrentMapCacheManager" />

                     //C:\0wkspc\clis413\clinical\src\main\java\com\cnhis\cloudhealth\clinical\util\cache\MyConcurrentMapCacheManager.java

                     -->

     <!--  (long expireTime sec, long maximumSize)  

        <bean id="cacheManager"

            class="com.cnhis.cloudhealth.clinical.util.cache.MyConcurrentMapCacheManager">

            <constructor-arg index="0" value="70" />

            <constructor-arg index="1" value="500000" />

        </bean>    

      <context:property-placeholder location="classpath:META-INF/prop/redis.properties"/>

        -->

        <context:property-placeholder  location="classpath:META-INF/prop/redis.properties,classpath*:/META-INF/prop/newid.properties,classpath*:/META-INF/prop/jdbc.properties" />

         

     

      

       <!--缓存管理器-->

        <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">

            <property name="caches">

                <set>

                    <!--自定义的redis缓存操作实现-->

                    <bean class="com.cnhis.cloudhealth.clinical.util.cache.SpringCacheWzRedis">

                        <property name="name" value="Cachename1"/>

                        <property name="redisTemplate" ref="redisTemplate"/>

                    </bean>

                </set>

            </property>

        </bean>

        <!--redis连接池配置-->

        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">

            <property name="maxIdle" value="${redis.maxIdle}"/>

            <!--

            <property name="maxTotal" value="${redis.maxTotal}"/>

            -->

            <property name="testOnBorrow" value="${redis.testOnBorrow}"/>

        </bean>

        <!--redis连接工厂配置-->

        <bean id="connectionFactory" 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.pass}"/>

            <property name="poolConfig" ref="poolConfig"/>

            <property name="usePool" value="true"/>

            <property name="database" value="2"/>

        </bean>

        <!--redis操作模板-->

        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">

            <property name="connectionFactory" ref="connectionFactory"/>

        </bean>

      

    <!-- end ati cache -->

    <!-- end ati cache -->

    1.4. CacheKeyGeneratorSpring 

    package com.cnhis.cloudhealth.clinical.util.cache;

    import java.lang.reflect.Array;

    import java.lang.reflect.Method;

    import java.nio.charset.Charset;

    import java.util.Map;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import org.springframework.cache.interceptor.KeyGenerator;

    import org.springframework.util.ClassUtils;

    import com.alibaba.fastjson.JSON;

    import com.google.common.hash.Hashing;

    //   com.cnhis.cloudhealth.clinical.util.cache.CacheKeyGeneratorSpring

    public class CacheKeyGeneratorSpring implements KeyGenerator {  

        // custom cache key  

        public static final int NO_PARAM_KEY = 0;  

        public static final int NULL_PARAM_KEY = 53;  

    private static Logger log = LoggerFactory.getLogger(CacheKeyGeneratorSpring.class);

        @Override  

        public Object generate(Object target, Method method, Object... params) {  

      

            StringBuilder key = new StringBuilder();  

            key.append(target.getClass().getSimpleName()).append(".").append(method.getName()).append(":");  

            if (params.length == 0) {  

                return key.append(NO_PARAM_KEY).toString();  

            }  

            for (Object param : params) {  

                if (param == null) {  

                    log.warn("input null param for Spring cache, use default key={}", NULL_PARAM_KEY);  

                    key.append(NULL_PARAM_KEY);  

                } else if (ClassUtils.isPrimitiveArray(param.getClass())) {  

                    int length = Array.getLength(param);  

                    for (int i = 0; i < length; i++) {  

                        key.append(Array.get(param, i));  

                        key.append(',');  

                    }  

                } else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) {  

                    key.append(param);  

                } else {  

                    log.warn("Using an object as a cache key may lead to unexpected results. " +  

                            "Either use @Cacheable(key=..) or implement CacheKey. Method is " + target.getClass() + "#" + method.getName());  

                  //  key.append(param.hashCode());  

                    if(  param instanceof Map  )

                    {

                     key.append( JSON.toJSONString(param) );  

                    }

                }  

                

                

                key.append('-');  

            }  

      

            String finalKey = key.toString();  

            long cacheKeyHash = Hashing.murmur3_128().hashString(finalKey, Charset.defaultCharset()).asLong();  

            log.debug("using cache key={} hashCode={}", finalKey, cacheKeyHash);  

            return key.toString();  

        }

     

    }  

  • 相关阅读:
    2019-07-08 L410 EST科技英语翻译
    L405 NYC-ATF4
    L403 Royal espionage
    L402 EST
    L401 哭声识别
    L400 How Trees Affect the Weather
    L398
    final, finally, finalize 的区别
    try {}里有一个 return 语句, 那么紧跟在这个 try 后的 finally {}里的 code会不会被执行,什么时候被执行,在 return 前还是后?
    下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s="a"+"b"+"c"+"d";
  • 原文地址:https://www.cnblogs.com/attilax/p/15197659.html
Copyright © 2020-2023  润新知