使用SpringBoot+Redis 给省、市、区/县、乡镇/街道做数据缓存

您所在的位置:网站首页 如何将省市县的数据融合一起使用 使用SpringBoot+Redis 给省、市、区/县、乡镇/街道做数据缓存

使用SpringBoot+Redis 给省、市、区/县、乡镇/街道做数据缓存

2024-06-21 11:16| 来源: 网络整理| 查看: 265

对应的sql脚本 : [ SQL脚本 ](https://gitee.com/liurunyong/address-sql) 一、流程

1、先把对应的SpringBoot 工程创建起来; 2、让你创建的工程连接对应的数据库,Redis服务; 3、开始编写代码,(此次我只提供对应的类、方法、和sql文件) 4、因为我使用的MyBatisPlus,所以mapper接口我就不展示了;

二、开始 1、model类: ProvinceModel: import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @ApiModel(description = "省") @TableName(value = "province") public class ProvinceModel implements Serializable { private Long provinceCode; private String provinceName; @TableField(exist=false) private CityModel cityModel; } CityModel import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @ApiModel(description = "市") @TableName(value = "city") public class CityModel implements Serializable { private Long cityCode; private String cityName; private Long superiorCode; }

AreaModel

import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @ApiModel(description = "区/县") @TableName(value = "area") public class AreaModel implements Serializable { private Long areaCode; private String areaName; private Long superiorCode; } SubDistirct import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @ApiModel(description = "街道办") @TableName(value = "sub_district") public class SubDistrictModel implements Serializable { private Long subDistrictCode; private String subDistrictName; private Long superiorCode; } 2、Mapper import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.liu.health.model.dictionary.ProvinceModel; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface ProvinceMapper extends BaseMapper { } import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.liu.health.model.dictionary.CityModel; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface CityMapper extends BaseMapper { } import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.liu.health.model.dictionary.AreaModel; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface AreaMapper extends BaseMapper { } import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.liu.health.model.dictionary.SubDistrictModel; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface SubDistrictMapper extends BaseMapper { } 3、Service import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.IService; import com.liu.health.model.dictionary.ProvinceModel; import java.util.List; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface ProvinceService extends IService { /** * 获取所有的省份 * @param queryWrapper 查询条件 * @return list */ List selectAllData(QueryWrapper queryWrapper); } import com.baomidou.mybatisplus.extension.service.IService; import com.liu.health.model.dictionary.CityModel; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface CityService extends IService { /** * 根据省份编号查询城市信息 * @param provinceCode 省份编号 * @return list */ List selectCityDataByProvinceCode(Long provinceCode); } import com.baomidou.mybatisplus.extension.service.IService; import com.liu.health.model.dictionary.AreaModel; import java.util.List; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface AreaService extends IService { /** * 根据城市编号查询区县信息 * @param cityCode 城市编号 * @return */ List selectAreaDataByCityCode(Long cityCode); } import com.baomidou.mybatisplus.extension.service.IService; import com.liu.health.model.dictionary.SubDistrictModel; import java.util.List; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ public interface SubDistrictService extends IService { /** * 根据区县编号查询乡镇街道信息 * @param areaCode 区县编号 * @return */ List selectSubDistrictDataByAreaCode(Long areaCode); } 4、ServiceImpl (redis核心) ProvinceServiceImpl import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.liu.health.dao.dictionary.ProvinceMapper; import com.liu.health.model.dictionary.ProvinceModel; import com.liu.health.service.dictionary.ProvinceService; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.List; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Service @Transactional(rollbackFor = Exception.class) public class ProvinceServiceImpl extends ServiceImpl implements ProvinceService { final ProvinceMapper provinceMapper; final RedisTemplate redisTemplate; ProvinceServiceImpl(ProvinceMapper provinceMapper, RedisTemplate redisTemplate) { this.provinceMapper = provinceMapper; this.redisTemplate = redisTemplate; } @Override public List selectAllData(QueryWrapper queryWrapper) { List provinceList = redisTemplate.opsForList().range("provinceList", 0, 30); if (provinceList.size() == 0) { provinceList = provinceMapper.selectList(queryWrapper); redisTemplate.opsForList().rightPushAll("provinceList", provinceList); } return provinceList; } } CityServiceImpl import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.liu.health.dao.dictionary.CityMapper; import com.liu.health.model.dictionary.CityModel; import com.liu.health.service.dictionary.CityService; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Service @Transactional(rollbackFor = Exception.class) public class CityServiceImpl extends ServiceImpl implements CityService { final RedisTemplate redisTemplate; final CityMapper cityMapper; CityServiceImpl(RedisTemplate redisTemplate, CityMapper cityMapper) { this.redisTemplate = redisTemplate; this.cityMapper = cityMapper; } @Override public List selectCityDataByProvinceCode(Long provinceCode) { // 获取redis中的数据 List cityModelList = getRedisCityData(provinceCode); if (cityModelList.size() == 0) { cityModelList = cityMapper.selectList(new QueryWrapper().in("superior_code", provinceCode)); } // 可以在这里将数据同步上redis return cityModelList; } /** * 获取redis的城市数据 * * @param provinceCode 省份代码 */ private List getDataBaseCityData(Long provinceCode) { List cityModelList = cityMapper.selectList(new QueryWrapper().in("superior_code", provinceCode)); return cityModelList; } /** * 获取redis的城市数据 * * @param provinceCode 省份代码 */ private List getRedisCityData(Long provinceCode) { Map cityData = redisTemplate.opsForHash().entries("cityData"); List cityModelList = new ArrayList(cityData.size()); CityModel cityModel = null; for (Map.Entry data : cityData.entrySet()) { if (StringUtils.equals(provinceCode.toString(), data.getValue().getSuperiorCode().toString())) { cityModel = data.getValue(); cityModelList.add(new CityModel().setCityCode(cityModel.getCityCode()).setCityName(cityModel.getCityName()) .setSuperiorCode(cityModel.getSuperiorCode())); } } return cityModelList; } } AreaServiceImpl import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.liu.health.dao.dictionary.AreaMapper; import com.liu.health.model.dictionary.AreaModel; import com.liu.health.service.dictionary.AreaService; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Service @Transactional(rollbackFor = Exception.class) public class AreaServiceImpl extends ServiceImpl implements AreaService { final RedisTemplate redisTemplate; final AreaMapper areaMapper; AreaServiceImpl(RedisTemplate redisTemplate, AreaMapper areaMapper) { this.areaMapper = areaMapper; this.redisTemplate = redisTemplate; } @Override public List selectAreaDataByCityCode(Long cityCode) { // 先获取redis中的区县 数据 List redisAreaData = getRedisAreaData(cityCode); if (redisAreaData.size() == 0) { redisAreaData= getDataBaseAreaData(cityCode); } return redisAreaData; } /** * 获取redis的区县数据 * * @param cityCode 城市代码 */ private List getDataBaseAreaData(Long cityCode) { List areaModelList = areaMapper.selectList(new QueryWrapper().in("superior_code", cityCode)); return areaModelList; } /** * 获取redis的区县数据 * * @param cityCode 城市代码 */ private List getRedisAreaData(Long cityCode) { Map areaData = redisTemplate.opsForHash().entries("areaData"); List areaModelList = new ArrayList(areaData.size()); AreaModel areaModel = null; for (Map.Entry data : areaData.entrySet()) { if (StringUtils.equals(cityCode.toString(), data.getValue().getSuperiorCode().toString())) { areaModel = data.getValue(); areaModelList.add(new AreaModel().setAreaCode(areaModel.getAreaCode()).setAreaName(areaModel.getAreaName()) .setSuperiorCode(areaModel.getSuperiorCode())); } } return areaModelList; } } SubDistrictServiceImpl import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.liu.health.dao.dictionary.AreaMapper; import com.liu.health.dao.dictionary.SubDistrictMapper; import com.liu.health.model.dictionary.AreaModel; import com.liu.health.model.dictionary.SubDistrictModel; import com.liu.health.service.dictionary.SubDistrictService; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @Service @Transactional(rollbackFor = Exception.class) public class SubDistrictServiceImpl extends ServiceImpl implements SubDistrictService { final RedisTemplate redisTemplate; final SubDistrictMapper subDistrictMapper; SubDistrictServiceImpl(RedisTemplate redisTemplate, SubDistrictMapper subDistrictMapper) { this.subDistrictMapper = subDistrictMapper; this.redisTemplate = redisTemplate; } @Override public List selectSubDistrictDataByAreaCode(Long areaCode) { // 先获取redis中的区县 数据 List subDistrictModelList = getRedisSubDistrictData(areaCode); if (subDistrictModelList.size() == 0) { subDistrictModelList= getDataBaseSubDistrictData(areaCode); } return subDistrictModelList; } /** * 获取redis的乡镇、街道数据 * * @param areaCode 区、县代码 */ private List getDataBaseSubDistrictData(Long areaCode) { List subDistrictModelList = subDistrictMapper.selectList(new QueryWrapper().in("superior_code", areaCode)); return subDistrictModelList; } /** * 获取redis的乡镇、街道数据 * * @param areaCode 区县代码 */ private List getRedisSubDistrictData(Long areaCode) { Map subDistrictData = redisTemplate.opsForHash().entries("subDistrictData"); List subDistrictModelList = new ArrayList(subDistrictData.size()); SubDistrictModel subDistrictModel = null; for (Map.Entry data : subDistrictData.entrySet()) { if (StringUtils.equals(areaCode.toString(), data.getValue().getSuperiorCode().toString())) { subDistrictModel = data.getValue(); subDistrictModelList.add(new SubDistrictModel().setSubDistrictCode(subDistrictModel.getSubDistrictCode()) .setSubDistrictName(subDistrictModel.getSubDistrictName()) .setSuperiorCode(subDistrictModel.getSuperiorCode())); } } return subDistrictModelList; } } 5、Controller import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.liu.health.common.response.ServerResponse; import com.liu.health.model.dictionary.AreaModel; import com.liu.health.model.dictionary.CityModel; import com.liu.health.model.dictionary.ProvinceModel; import com.liu.health.model.dictionary.SubDistrictModel; import com.liu.health.service.dictionary.AreaService; import com.liu.health.service.dictionary.CityService; import com.liu.health.service.dictionary.ProvinceService; import com.liu.health.service.dictionary.SubDistrictService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Author: battery * @Date: 2021/03/26 * @Description: */ @RestController @RequestMapping("/address/") @Api(tags = "地址模块") public class AddressController { final ProvinceService provinceService; final CityService cityService; final AreaService areaService; final SubDistrictService subDistrictService; final RedisTemplate redisTemplate; public AddressController(ProvinceService provinceService, CityService cityService, AreaService areaService, SubDistrictService subDistrictService, RedisTemplate redisTemplate) { this.provinceService = provinceService; this.cityService = cityService; this.areaService = areaService; this.subDistrictService = subDistrictService; this.redisTemplate = redisTemplate; } @GetMapping(value = "selectProvince") @ApiOperation(value = "获取所有省份") public ServerResponse getProvinceData() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.orderByAsc("province_code"); return ServerResponse.createBySuccess(provinceService.selectAllData(queryWrapper)); } @GetMapping(value = "selectCity") @ApiOperation(value = "根据省份获取城市") @ApiImplicitParam(value = "省份code", name = "provinceCode", paramType = "Long", required = true) public ServerResponse getCityData(Long provinceCode) { if (provinceCode if (cityCode if (areaCode // 所有的城市 List newData = cityService.list(new QueryWrapper().orderByAsc("city_code")); Map cityMap = new HashMap(); for (CityModel cityModel : newData) { cityMap.put(cityModel.getCityCode(), cityModel); } redisTemplate.opsForHash().putAll("cityData", cityMap); // 所有的区县 List areaData = areaService.list(new QueryWrapper().orderByAsc("area_code")); Map areaMap = new HashMap(); for (AreaModel areaModel : areaData) { areaMap.put(areaModel.getAreaCode(), areaModel); } redisTemplate.opsForHash().putAll("areaData", areaMap); // 所有的乡镇、街道 List subDistrictData = subDistrictService.list(new QueryWrapper().orderByAsc("sub_district_code")); Map subDistrictMap = new HashMap(); for (SubDistrictModel subDistrictModel : subDistrictData) { subDistrictMap.put(subDistrictModel.getSubDistrictCode(), subDistrictModel); } redisTemplate.opsForHash().putAll("subDistrictData", subDistrictMap); return ServerResponse.createBySuccess(); } }

演示结果: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3