Long cachedVersion = (Long) cacheWrapper.get(versionKey);
currentVersion = cachedVersion == null ? 0 : cachedVersion;
if (currentVersion != 0 && currentVersion == itemVersion) { // 版本一致则表示有效
LOGGER.debug("版本号一致,缓存命中");
if (definition.isPagination()) {
Page page = (Page) arguments[definition.getPageParameterIndex()];
if (page != null) { // 判断分页参数是非被复用
pageKey = definition.buildCachePageKey(key, arguments);
LOGGER.debug("缓存为需要分页的缓存,页码(" + page.getCurpage()
+ "),对应的分页缓存KEY为:" + pageKey);
Page cachePage = (Page) cacheWrapper.get(pageKey);
page.setTotal(cachePage.getTotal());
}
}
return cachedItem;
}
LOGGER.debug("当前版本为:" + currentVersion + ",缓存对象版本号为:" + itemVersion
+ ",Cache没有命中,直接调用DAO方法");
} else {//单个对象且为空,无法获取其版本信息,无法判断是否过期,而部分查询中为空只是暂时的,所以还是得查询
LOGGER.debug("单个对象,且缓存的对象为空,不能使用缓存机制,直接查询DAO");
}
}
}
Object result = invocation.proceed();
if (definition.isCacheDelete()) {
versionKey = definition.buildVersionKey(arguments, null);
// Long cachedVersion = (Long) cacheWrapper.get(versionKey);
// currentVersion = cachedVersion == null ? 0 : cachedVersion;
currentVersion = System.currentTimeMillis(); // 改用系统时间作为版本号,防止重构后的版本号与对象的版本正好一致,而是对象无法失效
cacheWrapper.add(versionKey, currentVersion, definition.getExpire());
LOGGER.debug("更新版本信息的缓存KEY:" + versionKey + "到版本" + currentVersion);
}
if (definition.isCachable()) { // 如果进入此操作则说明Cache已经过期,需要重新Cache了
if (currentVersion == 0 && result != null) { // 原来的version已经因为时间等原因过期,需要重新缓存
Long cachedCurrentVersion = null;
if (versionKey == null) { // 说明是第一次查询缓存,需要生产版本的key
Cachable cachableResult = definition.isReturnCollection() ? null
: (Cachable) result;
versionKey = definition.buildVersionKey(arguments, cachableResult);
LOGGER.debug("第一次查询缓存,需要生成版本信息的缓存KEY:" + versionKey);
cachedCurrentVersion = (Long) cacheWrapper.get(versionKey); // 由于第一次查询无法得知版本信息,所以在知道版本key后才需要再查一次版本信息
}
if (cachedCurrentVersion == null || cachedCurrentVersion <= 0) { // 为空或者无意义才表明版本信息也需要缓存,否则版本信息就为缓存的版本信息
currentVersion = System.currentTimeMillis(); // 改用系统时间作为版本号,防止重构后的版本号与对象的版本正好一致,而是对象无法失效
cacheWrapper.add(versionKey, currentVersion, definition.getExpire());
LOGGER.debug("更新版本信息的缓存KEY:" + versionKey + "到版本" + currentVersion);
} else {
currentVersion = cachedCurrentVersion;
}
}
CacheObjectWrapper item = new CacheObjectWrapper((Serializable) result, currentVersion);
cacheWrapper.add(key, item, definition.getExpire());
LOGGER.debug("缓存对象到:" + key);
if (definition.isPagination()) {
Page page = (Page) arguments[definition.getPageParameterIndex()];
if (page != null) {
if (pageKey == null) {
pageKey = definition.buildCachePageKey(key, arguments);
}
cacheWrapper.add(pageKey, page, definition.getExpire());
LOGGER.debug("缓存为需要分页的缓存,页码(" + page.getCurpage() + "),缓存分页对象到:" + pageKey);
}
}
}
return result;