当前位置: 首页 > news >正文

redis_点评(25.附件店铺—把数据库里的店铺按【类型分组】,批量导入Redis 的 GEO 地理位置结构)

店铺数据批量导入 Redis GEO 详解

这段代码的核心目标是:把数据库里的店铺数据,按类型分组后,批量写入 Redis 的 GEO 结构,为后续“附近店铺”查询做准备


一、整体流程概览


二、逐行代码拆解

1. 环境准备

@Resource private StringRedisTemplate stringRedisTemplate;

注入StringRedisTemplate,用于操作 Redis,尤其是 GEO 相关命令。


2. 主方法loadShopData()

@Test void loadShopData(){ // 1. 查询店铺信息 List<Shop> list = shopService.list();
  • 调用shopService.list()从数据库中查询所有店铺

  • 得到List<Shop>,包含所有店铺的ID、类型ID、经纬度等信息。


3. 按店铺类型分组

// 2. 把店铺分组,按照typeId分组,typeId一致的放到一个集合 Map<Long, List<Shop>> map = list.stream() .collect(Collectors.groupingBy(Shop::getTypeId));
  • 使用 Java 8 Stream 的Collectors.groupingBy,按Shop::getTypeId(店铺类型ID)分组。

  • 结果:Map<Long, List<Shop>>,Key 是typeId,Value 是该类型下的所有店铺列表。


4. 遍历分组,批量写入 Redis

// 3. 分批完成写入Redis for (Map.Entry<Long, List<Shop>> entry : map.entrySet()) { // 3.1 获取类型id Long typeId = entry.getKey(); String key = "shop:geo:" + typeId; // 3.2 获取同类型的店铺的集合 List<Shop> value = entry.getValue(); List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>(value.size()); // 3.3 构建GeoLocation对象 for (Shop shop : value) { locations.add(new RedisGeoCommands.GeoLocation<>( shop.getId().toString(), // member:店铺ID new Point(shop.getX(), shop.getY()) // 经纬度 )); } // 3.4 批量写入Redis GEO stringRedisTemplate.opsForGeo().add(key, locations); }
一、逐段关键解释
1.map.entrySet()
  • 所属:java.util.Map接口的方法

  • 作用:把Map转成一个「键值对集合」,方便for-each遍历

  • 业务含义:遍历按typeId分组后的店铺数据,拿到每一组的typeId和该类型下的所有店铺


2.RedisGeoCommands.GeoLocation
  • 所属:Spring Data Redis 提供的地理位置实体类

  • 用途:专门给 Redis GEO 功能封装数据,只存两个东西:

    • name:成员名称(这里存店铺 ID,后续查询时可直接拿到)

    • point:坐标点(经度 + 纬度)


3.List<RedisGeoCommands.GeoLocation<String>> locations = new ArrayList<>(shops.size());
  • 含义:创建一个List集合,名字叫locations,只能装GeoLocation类型的对象

  • 通俗理解:一个专门装地理位置的盒子,初始容量设为店铺数量,避免扩容开销


4.locations.add(new RedisGeoCommands.GeoLocation<>(...))
  • 含义:创建一个新的GeoLocation对象(单个店铺的地理位置),然后add放进上面的locations集合里

  • 通俗理解:把一个个 “地理位置” 放进 “盒子” 里,准备批量写入 Redis


5.stringRedisTemplate.opsForGeo().add(key, locations);
  • 作用:一次性把locations盒子里的所有数据,批量写入 Redis GEO 集合

  • 优势:比单条写入减少多次网络 IO,大幅提升导入效率

6.关键细节:
  • Redis Key 设计shop:geo:{typeId},不同类型的店铺存储在不同的 GEO 集合中,后续查询时按类型筛选更高效。

  • GeoLocation对象

    • member:店铺ID(后续查询结果中返回的标识)

    • Point:店铺的经纬度(x, y)

  • 批量写入优化:先构建好所有GeoLocation对象,再一次性调用add(key, locations),避免多次网络IO,大幅提升导入效率。


三、核心技术点:Redis GEO

Redis GEO 是专门用于存储和查询地理位置数据的数据结构,核心命令包括:

  • GEOADD key longitude latitude member:添加地理位置

  • GEORADIUS key longitude latitude radius:按半径查询附近的成员

这段代码中,我们把每个类型的店铺都存入了对应shop:geo:{typeId}的 GEO 集合中,后续就可以直接用GEORADIUS命令,查询指定经纬度附近的该类型店铺。


四、总结

这段代码将数据库中的所有店铺按类型分组,批量构建为GeoLocation对象,并一次性写入 Redis GEO 结构,为后续实现“附近店铺”查询功能做数据准备。

http://www.jsqmd.com/news/999992/

相关文章:

  • 如何永久保存QQ空间青春记忆:GetQzonehistory完整备份方案
  • 2026 库尔勒黄金回收市场解析:5 大机构测评、行情与避坑要点 - 速递信息
  • 义乌财税服务口碑榜 | 正规资质・全程代办・财税护航 —— 科启财税 荣伦财税凭专业服务领跑义乌企业注册赛道 - 资讯快报
  • 避坑指南:在OpenFOAM的twoPhaseEulerFoam中正确选择曳力模型(以WenYu和Ergun为例)
  • 2026 年驿城区短视频全链路流量运营与本地首页排位:中小企业线上引流完整策略 - 年度推荐企业名录
  • 2026广州名表回收新手须知+行业隐性规则揭秘 - 开心测评
  • 3步打造梦想岛屿:Happy Island Designer完全指南
  • # 2026年华中山涧漂流乐园实力排行榜:河南尧山的5大权威推荐 - 十大品牌榜
  • FastReport开源报表工具:5步打造专业级数据可视化报表
  • 2026年 欧米茄官方售后服务网点实地考察报告(中国区60+门店全覆盖) - 欧米茄中国服务中心
  • 欧洲专列X吉马冠名X抖音榜首:解锁后谷咖啡“圈粉密码”! - 品牌速递
  • 量子物理信息神经网络在多物种反应扩散系统中的应用
  • UnicodeIt:LaTeX到Unicode转换的终极解决方案
  • Obsidian-Export:解锁Obsidian笔记跨平台迁移的智能转换方案
  • 郑州大牌包包回收实测|LV / 香奈儿 / 爱马仕真实成交价 - 讯息早知道
  • 2026 年新消息:探秘义乌靠谱财税服务商 —— 荣伦财税的实力与服务解析 - 资讯纵览
  • 从星巴克排队到服务器请求:M/M/1模型教你量化‘拥堵’,优化资源配置
  • 2026 年合肥梅雨季|马桶堵了别硬通,家家通就近上门 - 吉修匠
  • Snap Hutao:原神玩家的终极Windows工具箱完全指南
  • SDE | 均方收敛阶
  • 2026福州黄金回收怎么选?5家正规门店深度测评,新手变现必看 - 禹竞
  • Boss-Key:Windows平台终极窗口隐藏解决方案,一键保护你的工作隐私
  • 【广州楼市研判系列34】2026番禺置业避坑指南|读懂片区能级分化,自住置换双向守住房产保值底盘 - 速递信息
  • 2026年6月最新! 欧米茄 中国区官方维修门店地址公布,服务热线同步启用 - 欧米茄中国服务中心
  • 2026年曲阳玻璃钢雕塑与铸铜景观定制:源头厂家对标选型指南 - 年度推荐企业名录
  • 用带故障探弧的智能保护器守护租房用电安全 - 资讯报道
  • 图卷积网络过平滑问题与Laplacian-LoRA解决方案
  • 2026 年 6 月欧米茄官方授权维修服务网点实地核验报告:全方位升级售后服务体系,用户服务体验显著提升 - 欧米茄中国服务中心
  • 西安家谱印刷找五花马印务|西北专业宣纸家谱、精装族谱定制权威机构 - 小熊打盹
  • 2026年亨得利 官方售后服务网点实地考察报告(中国区60+门店全覆盖) - 亨得利中国服务中心