redis+spring注解方式实现配置缓存时间过期

 
 

 
         
       
   
 
   
 
 
 









 
   
   
   
   
   
   
 
 
   
   
   
   
 
 
   
   
 
 
 
 
 
     
       
    
     
   


       
           
                caiya_a
                caiya_test
                sampleCache1
                memoryCache
                scanCache
                padIndexCache
                sampleCache1
                sampleCache1
           

       

       
       
       
       
       
       
       
       
           
               
           

       

       
       
       
       
       
       

   


package com.douwong.manage.test.action;


import java.util.Collection;
import java.util.Collections;
import java.util.regex.Pattern;


import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;


import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.cache.Cache;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCachePrefix;
import org.springframework.data.redis.core.RedisOperations;


//import lombok.extern.log4j.Log4j2;


/**
 * 扩展redis缓存管理器
 *


 * 重写 RedisCacheManager createCache 方法
 *


 * 在缓存名字上添加过期时间表达式 如:cachename#60*60
 * @author hbp
 */
public class ExtendedRedisCacheManager extends RedisCacheManager {



private static final Logger logger = Logger.getLogger(ExtendedRedisCacheManager.class);


    private static final ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");


    private static final Pattern pattern = Pattern.compile("[+\\-*/%]");


    private String defaultCacheName;


    private char separator = '#';


    public ExtendedRedisCacheManager(RedisOperations redisOperations) {
        this(redisOperations, Collections.emptyList());
    }


    public ExtendedRedisCacheManager(RedisOperations redisOperations, Collection cacheNames) {
        super(redisOperations, cacheNames);
    }


    @Override
    public Cache getCache(String name) {
        // try to get cache by name
        RedisCache cache = (RedisCache) super.getCache(name);
        if (cache != null) {
            return cache;
        }


        // there's no cache which has given name
        // find separator in cache name
        int index = name.lastIndexOf(getSeparator());
        if (index < 0) {
            return null;
        }


        // split name by the separator
        String cacheName = name.substring(0, index);
        if(StringUtils.isBlank(cacheName)){
            cacheName = defaultCacheName;
        }
        cache = (RedisCache) super.getCache(cacheName);
        if (cache == null) {
            return null;
        }


        // get expiration from name
        Long expiration = getExpiration(name, index);
        if (expiration == null || expiration < 0) {
            logger.warn("Default expiration time will be used for cache '{}' because cannot parse '{}', cacheName : " + cacheName + ", name : " + name);
            return cache;
        }


        return new RedisCache(cacheName, (isUsePrefix() ? getCachePrefix().prefix(cacheName) : null), getRedisOperations(), expiration);
    }




    public char getSeparator() {
        return separator;
    }


    /**
     * Char that separates cache name and expiration time, default: #.
     *
     * @param separator
     */
    public void setSeparator(char separator) {
        this.separator = separator;
    }


    private Long getExpiration(final String name, final int separatorIndex) {
        Long expiration = null;
        String expirationAsString = name.substring(separatorIndex + 1);
        try {
            // calculate expiration, support arithmetic expressions.
            if(pattern.matcher(expirationAsString).find()){
                expiration = (long) Double.parseDouble(scriptEngine.eval(expirationAsString).toString());
            }else{
                expiration = Long.parseLong(expirationAsString);
            }
        } catch (NumberFormatException ex) {
            logger.error(String.format("Cannnot separate expiration time from cache: '%s'", name), ex);
        } catch (ScriptException e) {
            logger.error(String.format("Cannnot separate expiration time from cache: '%s'", name), e);
        }


        return expiration;
    }


    @Override
    public void setUsePrefix(boolean usePrefix) {
        super.setUsePrefix(usePrefix);
    }


    @Override
    public void setCachePrefix(RedisCachePrefix cachePrefix) {
        super.setCachePrefix(cachePrefix);
    }


    public void setDefaultCacheName(String defaultCacheName) {
        this.defaultCacheName = defaultCacheName;
    }


}


注意:在引入相关jar包的时候,必须要用jedis_2.9.0.jar、spring-data-redis-1.6.0.RELEASE.jar,因为这些jar包的版本对整个项目影响很大的;

可以参考代码来源:https://my.oschina.net/wnjustdoit/blog/644311


你可能感兴趣的:(redis缓存)