缓存的使用--从缓存中获取省市区

目前微服务是企业项目运用比较多,但经常存在需要频繁调用其他模块的情况(调上千次),会导致服务崩溃。比如我遇到的在导入文件时需要对省市区进行校验,数量到达两三千时就会出问题,所以将省市区时行缓存,每次从缓存中获取数据,减少服务的调用。表结构如下:

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

}

 

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