目前微服务是企业项目运用比较多,但经常存在需要频繁调用其他模块的情况(调上千次),会导致服务崩溃。比如我遇到的在导入文件时需要对省市区进行校验,数量到达两三千时就会出问题,所以将省市区时行缓存,每次从缓存中获取数据,减少服务的调用。表结构如下:
level:1--省 2--市 3--区
抽象接口:AbstractCacheService
package com.navasmart.platform.api.cache;
import com.github.navagraha.scwbasecore.utils.DateTimeUtils;
import com.navasmart.platform.api.entity.infrastruture.InfraDict;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractCacheService {
/**
* <p>上次缓存更新时间
*/
protected LocalDateTime lastUpdate = LocalDateTime.now();
private Map<String, InfraDict> cacheMap = new HashMap<>();
/**
* <p>获取应该需要缓存的信息
*
* @return map 这个map会被缓存
*/
abstract Map<String, InfraDict> getCacheMap(String key);
/**
* <p>根据key值取一个对象
*
* @param
*/
public InfraDict getNameById(String key) {
if (cacheMap.get(key) == null || isTimeOut()) {
cacheMap.putAll(getCacheMap(key));
lastUpdate = LocalDateTime.now();
}
return cacheMap.get(key);
}
public InfraDict getNameById(Integer dicId) {
return getNameById(String.valueOf(dicId));
}
/**
* <p>超时时间,如修改超时时间则重写该方法
*
* @param true 数据已过期 false 数据没有过期
*/
protected boolean isTimeOut() {
long betweenHour = DateTimeUtils.betweenHour(lastUpdate, LocalDateTime.now());
return betweenHour > 1;
}
}
实现类ProvinceCacheService(省缓存)
package com.navasmart.platform.api.cache;
import com.navasmart.platform.api.entity.infrastruture.InfraDict;
import com.navasmart.platform.api.feign.infrastruture.InfraDictFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ProvinceCacheService extends AbstractCacheService{
@Autowired
private InfraDictFeignClient infraDictFeignClient;
@Override
Map<String, InfraDict> getCacheMap(String key) {
Map<String,InfraDict> cache=new HashMap<>();
InfraDict condition=new InfraDict();
condition.setLevel("1");
List<InfraDict> regionList = infraDictFeignClient.getRegionListByCondition(condition);
for(InfraDict dic:regionList) {
cache.put(dic.getName(), dic);
}
return cache;
}
public InfraDict getIdByName(String provinceName){
return getNameById(provinceName);
}
/**
* <p>永不过时
*/
@Override
protected boolean isTimeOut() {
return false;
}
}
调用举例
public class HelloWorld {
@Autowired
private ProvinceCacheService provinceCacheService;
public static void main(String args[]) {
String code=provinceCacheService.getIdByName("河南省");
}
}
市区也类似
实现类CityCacheService(市缓存)
package com.navasmart.platform.api.cache;
import com.github.navagraha.scwbasecore.utils.DateTimeUtils;
import com.navasmart.platform.api.entity.infrastruture.InfraDict;
import com.navasmart.platform.api.feign.infrastruture.InfraDictFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class CityCacheService extends AbstractCacheService{
@Autowired
private InfraDictFeignClient infraDictFeignClient;
@Override
Map<String, InfraDict> getCacheMap(String key) {
Map<String,InfraDict> cache=new HashMap<>();
InfraDict condition=new InfraDict();
condition.setLevel("2");
List<InfraDict> regionList = infraDictFeignClient.getRegionListByCondition(condition);
for(InfraDict dic:regionList) {
cache.put(dic.getName(), dic);
}
return cache;
}
public InfraDict getIdByName(String cityName){
return getNameById(cityName);
}
/**
* <p>一天一更新
*/
@Override
protected boolean isTimeOut() {
return DateTimeUtils.betweenDay(LocalDateTime.now(), lastUpdate) > 1;
}
}
实现类DistrictCacheService(区缓存)
package com.navasmart.platform.api.cache;
import com.github.navagraha.scwbasecore.utils.DateTimeUtils;
import com.navasmart.platform.api.entity.infrastruture.InfraDict;
import com.navasmart.platform.api.feign.infrastruture.InfraDictFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class DistrictCacheService extends AbstractCacheService{
@Autowired
private InfraDictFeignClient infraDictFeignClient;
@Override
Map<String, InfraDict> getCacheMap(String key) {
Map<String,InfraDict> cache=new HashMap<>();
InfraDict condition=new InfraDict();
condition.setLevel("3");
List<InfraDict> regionList = infraDictFeignClient.getRegionListByCondition(condition);
for(InfraDict dic:regionList) {
cache.put(dic.getName(), dic);
}
return cache;
}
public InfraDict getIdByName(String cityName){
return getNameById(cityName);
}
/**
* <p>一天一更新
*/
@Override
protected boolean isTimeOut() {
return DateTimeUtils.betweenDay(LocalDateTime.now(), lastUpdate) > 1;
}
}