[Change] 将部分CacheStore对象的类型调整为CacheStore<>以保证DIP, 增加灵活性;

[Change] 将Ranking缓存调整为JsonObjectRedisListCacheStore, 减少不必要的缓存数据查询;
This commit is contained in:
LamGC 2020-04-16 10:59:18 +08:00
parent c0c9a2d299
commit b720f657d0

View File

@ -47,10 +47,10 @@ public class BotCommandProcess {
.create(); .create();
private final static Hashtable<String, File> imageCache = new Hashtable<>(); private final static Hashtable<String, File> imageCache = new Hashtable<>();
private final static JsonRedisCacheStore illustInfoCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "illustInfo", gson); private final static CacheStore<JsonElement> illustInfoCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "illustInfo", gson);
private final static JsonRedisCacheStore illustPreLoadDataCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "illustPreLoadData", gson); private final static CacheStore<JsonElement> illustPreLoadDataCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "illustPreLoadData", gson);
private final static JsonRedisCacheStore searchBodyCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "searchBody", gson); private final static CacheStore<JsonElement> searchBodyCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "searchBody", gson);
private final static JsonRedisCacheStore rankingCache = new JsonRedisCacheStore(BotEventHandler.redisServer, "ranking", gson); private final static CacheStore<List<JsonObject>> rankingCache = new JsonObjectRedisListCacheStore(BotEventHandler.redisServer, "ranking", gson);
private final static CacheStore<List<String>> pagesCache = new RedisPoolCacheStore<List<String>>(BotEventHandler.redisServer, "imagePages") { private final static CacheStore<List<String>> pagesCache = new RedisPoolCacheStore<List<String>>(BotEventHandler.redisServer, "imagePages") {
@Override @Override
protected String parse(List<String> dataObj) { protected String parse(List<String> dataObj) {
@ -194,7 +194,7 @@ public class BotCommandProcess {
} }
//TODO(LamGC, 2020.4.11): 将JsonRedisCacheStore更改为使用Redis的List集合, 以提高性能 //TODO(LamGC, 2020.4.11): 将JsonRedisCacheStore更改为使用Redis的List集合, 以提高性能
List<JsonObject> rankingInfoList = getRankingInfoByCache(type, mode, queryDate, 0, Math.max(0, itemLimit), false); List<JsonObject> rankingInfoList = getRankingInfoByCache(type, mode, queryDate, 1, Math.max(0, itemLimit), false);
if(rankingInfoList.isEmpty()) { if(rankingInfoList.isEmpty()) {
return "无法查询排行榜,可能排行榜尚未更新。"; return "无法查询排行榜,可能排行榜尚未更新。";
} }
@ -679,31 +679,29 @@ public class BotCommandProcess {
String date = new SimpleDateFormat("yyyyMMdd").format(queryDate); String date = new SimpleDateFormat("yyyyMMdd").format(queryDate);
String requestSign = buildSyncKey(contentType.name(), ".", mode.name(), ".", date); String requestSign = buildSyncKey(contentType.name(), ".", mode.name(), ".", date);
JsonArray result = null; List<JsonObject> result = null;
if(!rankingCache.exists(requestSign) || flushCache) { if(!rankingCache.exists(requestSign) || flushCache) {
synchronized(requestSign) { synchronized(requestSign) {
if(!rankingCache.exists(requestSign) || flushCache) { if(!rankingCache.exists(requestSign) || flushCache) {
log.info("Ranking缓存失效, 正在更新...(RequestSign: {})", requestSign); log.info("Ranking缓存失效, 正在更新...(RequestSign: {})", requestSign);
List<JsonObject> rankingResult = pixivDownload.getRanking(contentType, mode, queryDate, 1, 500); List<JsonObject> rankingResult = pixivDownload.getRanking(contentType, mode, queryDate, 1, 500);
JsonArray rankingArr = new JsonArray(rankingResult.size()); if(rankingResult.size() == 0) {
rankingResult.forEach(rankingArr::add);
if(rankingArr.size() == 0) {
log.info("数据获取失败, 将设置浮动有效时间以准备下次更新."); log.info("数据获取失败, 将设置浮动有效时间以准备下次更新.");
} }
result = new ArrayList<>(rankingResult).subList(start - 1, range);
result = rankingArr; rankingCache.update(requestSign, rankingResult,
rankingCache.update(requestSign, rankingArr, rankingResult.size() == 0 ? 5400000 + expireTimeFloatRandom.nextInt(1800000) : 0);
rankingArr.size() == 0 ? 5400000 + expireTimeFloatRandom.nextInt(1800000) : 0);
log.info("Ranking缓存更新完成.(RequestSign: {})", requestSign); log.info("Ranking缓存更新完成.(RequestSign: {})", requestSign);
} }
} }
} }
if (Objects.isNull(result)) { if (Objects.isNull(result)) {
result = rankingCache.getCache(requestSign).getAsJsonArray(); result = rankingCache.getCache(requestSign, start - 1, range);
log.debug("RequestSign [{}] 缓存命中.", requestSign); log.debug("RequestSign [{}] 缓存命中.", requestSign);
} }
return PixivDownload.getRanking(result, start, range); log.debug("Result-Length: {}", result.size());
return PixivDownload.getRanking(result, start - 1, range);
} }
private static String buildSyncKey(String... keys) { private static String buildSyncKey(String... keys) {