一、功能概述
应用启动时将行政区划数据(市、县)加载到内存缓存,避免频繁查询数据库,提供 O(1) 的查询效率。
二、核心实现
2.1 初始化监听器
java
@Component
@AllArgsConstructor
public class DbCacheDataInit implements ApplicationRunner {
private final BasicRegionService basicRegionService;
@Override
public void run(ApplicationArguments args) throws Exception {
List<BasicRegion> regions = basicRegionService.list();
for (BasicRegion region : regions) {
if (DataConstant.REGION_LEVEL_OF_CITY.equals(region.getLevel())) {
DbCacheData.cities.put(region.getAdcd(), region.getAdnm());
}
if (DataConstant.REGION_LEVEL_OF_COUNTY.equals(region.getLevel())) {
DbCacheData.counties.put(region.getAdcd(), region.getAdnm());
}
}
}
}
三、调用方式
3.1 自动触发
通过 @Component 注解自动注册,应用启动时自动执行。
3.2 业务使用
java
// 获取市名称
String cityName = DbCacheData.cities.get("130100");
// 获取县名称
String countyName = DbCacheData.counties.get("130102");
// 校验行政区代码
boolean isValidCity = DbCacheData.cities.containsKey(adcd);
// 获取所有城市列表
List<String> cityList = new ArrayList<>(DbCacheData.cities.values());
3.3 服务层示例
java
public class RegionService {
public String getRegionName(String adcd, Integer level) {
if (DataConstant.REGION_LEVEL_OF_CITY.equals(level)) {
return DbCacheData.cities.get(adcd);
} else if (DataConstant.REGION_LEVEL_OF_COUNTY.equals(level)) {
return DbCacheData.counties.get(adcd);
}
return null;
}
}
四、适用场景
- 基础数据查询
- 数据转换和校验
- 报表统计和展示
- 需要频繁访问的配置数据