//先获取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 存在本地缓存中 解决无法序列化存放redisdataExchangeCache.put(localCacheKey, exchange);RuleManager.putTplUpdateTime(exchTplCode, System.currentTimeMillis()+"");return exchange;} catch (RegisterException e) {log.error("getDataExchByCode error:",e);}return null;}