在上篇《spring + ehcache + redis两级缓存实战篇(1)》中,最后遗留了两个问题给大家思考:
第一个是访问10次本地EhCache 强制访问一次redis 使得激活数据或更新数据,这样会不会更好一些呢?
第二个是使用spring @Cacheable注解缓存方法时,将list参数的地址作为key存储,是否会有问题?
针对上面两个问题,我们主要来探讨如何解决。JUST DO IT! GO!
第一个问题
在上篇TODO处我们标记了问题可能要改进的地方。代码是最好的语言,就不做过多解释了。主要是Element是对value的一个封装,附加了一些状态信息。
EhRedisCache.java
private int activeCount = 10;//默认十次
@Override
public ValueWrapper get(Object key) {
Element value = ehCache.get(key);
LOG.info("Cache L1 (ehcache) :{}={}",key,value);
if (value!=null) {
//TODO 访问10次EhCache 强制访问一次redis 使得数据不失效
if(value.getHitCount() < activeCount){
return (value != null ? new SimpleValueWrapper(value.getObjectValue()) : null);
}else{
value.resetAccessStatistics();
}
}
final String keyStr = key.toString();
Object objectValue = redisTemplate.execute(new R