项目之前做的整体redis缓存时间,经过几个小时折腾发现原本项目将redis缓存,与shiro的redis缓存分开了,也照成了不生效的原因,后将redis配置重写在名称加上缓存时间,则完成效果,不加为默认时间,加上就是自己写的时间
调用位置加上
@Cacheable(value = "publicReleaseStatistics#60", key = "'publicReleaseStatistics")
重写Redis.
public class ExtendedRedisCacheManager extends RedisCacheManager {
private static final ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
private static final Pattern pattern = Pattern.compile("[+\\-*/%]");
/**
* 分隔符
*/
private char separator = '#';
public ExtendedRedisCacheManager(RedisOperations redisOperations) {
super(redisOperations);
}
@Override
@SuppressWarnings("unchecked")
protected RedisCache createCache(String cacheName) {
// 获取默认时间
long expiration = computeExpiration(cacheName);
int index = cacheName.indexOf(this.getSeparator());
if (index > 0) {
expiration = getExpiration(cacheName, index, expiration);
}
LoggerUtils.debug(this.getClass(),cacheName+",缓存时间="+expiration);
return new RedisCache(cacheName, (isUsePrefix() ? getCachePrefix().prefix(cacheName) : null),
getRedisOperations(), expiration);
}
/**
* 计算缓存时间
* @param name 缓存名字 cache#60*60
* @param separatorIndex 分隔符位置
* @param defalutExp 默认缓存时间
* @return
*/
protected long getExpiration(final String name, final int separatorIndex, final long defalutExp) {
Long expiration = null;
String expirationAsString = name.substring(separatorIndex + 1);
try {
if (pattern.matcher(expirationAsString).find()) {
expiration = NumberUtils.toLong(scriptEngine.eval(expirationAsString).toString(), defalutExp);
} else {
expiration = NumberUtils.toLong(expirationAsString, defalutExp);
}
} catch (ScriptException e) {
LoggerUtils.fmtError(this.getClass(),e,"缓存时间转换错误:{},异常:{}",name,e.getMessage());
}
return Objects.nonNull(expiration) ? expiration.longValue() : defalutExp;
}
public char getSeparator() {
return separator;
}
public void setSeparator(char separator) {
this.separator = separator;
}
}
最后因为项目是MVC 在MVC引入
<bean id="cacheManager"
class="com.goafanti.core.cache.ExtendedRedisCacheManager">
<constructor-arg index="0" ref="redisTemplate" />
<property name="defaultExpiration" value="86400" />
</bean>
<bean id="shrioRedisCacheManager"
class="com.goafanti.core.shiro.cache.ShiroRedisCacheManager">
<property name="redisTemplate" ref="sessionRedisTemplate" />
<property name="expire" value="2592000" />
</bean>
这样就可以完成单独的配置了,不过好像原本时间不太对,不影响整体流程,需要自己改下就好。