构建空间记忆

我花了三个月的时间构建了一个“物理世界的 Pinterest”。

这个想法很简单:你在特定的 GPS 坐标留下数字笔记、照片或故事。只有当人们亲身站在那个确切的位置时,才能看到它们。它将现实世界变成了一个数字时间胶囊的集合。

构建一个基于地理位置的应用比看起来要难。以下是我在技术栈方面学到的经验。

空间数据库

如果你想实现规模化,不能只把经纬度作为简单的数字进行存储。你需要空间索引。我使用了 PostgreSQL 配合 PostGIS。

它能够处理:

  • 使用 R-tree 的空间索引
  • 内置距离计算
  • 快速的邻近查询

如果你需要查找用户 50 米范围内的记忆,PostGIS 会承担大部分繁重的工作。

缓存策略

热门景点会收到过多的请求。每两秒访问一次数据库会对性能产生负面影响。我使用 Redis GEO 命令来缓存繁忙区域的记忆 ID。

专业提示:不要在 Redis 中缓存整个对象,只缓存 ID。这能保持较低的内存占用,并将查询时间从 20ms 缩短到 2ms。

上传模式

如果你的服务器处理每一次照片上传,它会在高负载下崩溃。我使用了一种两阶段上传模式:

  • 客户端向服务器请求预签名 URL
  • 客户端将文件直接上传到 Cloudflare R2
  • 客户端在上传完成后告知服务器

我选择 R2 而不是 S3,是因为它没有出站费用(egress fees)。当用户下载媒体文件时,这能节省大量成本。

有效之处

  • PostGIS 和 Redis GEO 使空间查询变得快速。
  • 直接上传到 R2 让后端能够实现扩展。
  • Go 和 Gin 提供了高性能和低内存占用。
  • 渐进式隐私(私密、好友或公开)保护了用户。

遇到的问题

  • 在建筑高耸的城市中,GPS 精度不稳定。
  • “冷启动”问题是真实存在的。应用需要大量用户才能产生活力。
  • 内容审核需要持续的关注。

构建这个应用让我明白,对于社交应用来说,物理位置是一个被低估的维度。当数字内容与真实地点绑定时,它会显得更有意义。

Source: https://dev.to/kevinten10/building-spatial-memory-why-i-built-a-pinterest-for-the-physical-world-and-what-i-learned-bpm

Optional learning community: https://t.me/GyaanSetuAi