本地缓存和Redis缓存 存储更新时间的更新套路

//先获取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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值