spring redis 与shiro redis缓存时间问题。

项目之前做的整体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>

这样就可以完成单独的配置了,不过好像原本时间不太对,不影响整体流程,需要自己改下就好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值