目前微服務是企業項目運用比較多,但經常存在需要頻繁調用其他模塊的情況(調上千次),會導致服務崩潰。比如我遇到的在導入文件時需要對省市區進行校驗,數量到達兩三千時就會出問題,所以將省市區時行緩存,每次從緩存中獲取數據,減少服務的調用。表結構如下:
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;
}
}