緩存的使用--從緩存中獲取省市區

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

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;
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章