//先获取redis key和local key
//从reids中获取数据
– 为空
先设置redis缓存30天,value为当前时间
然后设置本地缓存,value为当前时间
从数据库里读数据
– 不为空
获取本地缓存时间
if本地缓存时间 < redis缓存时间(认为已更新)或者本地为空
从数据库读数据
else
从本地缓存获取,获取不到的从数据库获取
public DataExchange getDataExchByCode(String exchTplCode) {
DataExchange exchange = null;
String cacheKey = String.format("exchTplChangeTime:%s", exchTplCode);
String changeTime = redisCacheHelper.getString(cacheKey);
// String serverIp = IPUtil.getLocalIP();
// String cacheKey = String.format("DataExchange:%s:%s", exchTplCode,serverIp);
String localCacheKey = String.format("DataExchange:%s:Local", exchTplCode);
//String redisValue = redisCache.get(cacheKey);
if(changeTime==null) {
//待确认是否优化,redis修改时间为空,代表没有修改,理论不需要刷新本地缓存(刷新会产生耗时)
setExchTplUpdateTime(exchTplCode);
exchange = createDataExchange(exchTplCode,localCacheKey);
}else {
String localTime = RuleManager.getTplUpdateTime(exchTplCode);
//本地加载时间为空 或者本地时间小于规则更新时间
if(StringUtils.isBlank(localTime) || Long.parseLong(changeTime)>Long.parseLong(localTime)) {
exchange = createDataExchange(exchTplCode,localCacheKey);
}else {
exchange = dataExchangeCache.computeIfAbsent(localCacheKey, k ->
createDataExchange(exchTplCode,localCacheKey));
}
}
return exchange;
}
public void setExchTplUpdateTime(String tplCode) {
String cacheKey = String.format("exchTplChangeTime:%s", tplCode);
redisCacheHelper.setString(cacheKey,System.currentTimeMillis()+"",CACHETIME);
}
private DataExchange createDataExchange(String exchTplCode,String localCacheKey) {
DataExchange exchange;
try {
exchange = new DataExchange(exchTplCode);
//DataExchange 存在本地缓存中 解决无法序列化存放redis
dataExchangeCache.put(localCacheKey, exchange);
RuleManager.putTplUpdateTime(exchTplCode, System.currentTimeMillis()+"");
return exchange;
} catch (RegisterException e) {
log.error("getDataExchByCode error:",e);
}
return null;
}
1117

被折叠的 条评论
为什么被折叠?



