V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
dbfox
V2EX  ›  程序员

技术问题: APP 需要做一个附近的人的功能,怎么做呢?数据库没法查性能也差(已知在线用户经纬度)

  •  
  •   dbfox · 2017 年 11 月 27 日 · 4948 次点击
    这是一个创建于 2975 天前的主题,其中的信息可能已经有所发展或是发生改变。
    V 友一般都有哪些好的技术方案?
    30 条回复    2019-10-15 23:24:56 +08:00
    warlock
        1
    warlock  
       2017 年 11 月 27 日
    GeoHash
    dbfox
        2
    dbfox  
    OP
       2017 年 11 月 27 日
    发现 redis 有这样的功能

    命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

    命令描述:

    以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

    范围可以使用以下其中一个单位:

    m 表示单位为米。
    km 表示单位为千米。
    mi 表示单位为英里。
    ft 表示单位为英尺。
    blacklee
        3
    blacklee  
       2017 年 11 月 27 日
    你有多少用户?
    dbfox
        4
    dbfox  
    OP
       2017 年 11 月 27 日
    @blacklee 20 万
    Immortal
        5
    Immortal  
       2017 年 11 月 27 日
    以前看过一个早期的文章 年代有点久远 LZ 可以重新测试和评估
    https://ruby-china.org/topics/22059
    Immortal
        6
    Immortal  
       2017 年 11 月 27 日
    你说的 redis geo 功能 是去年还是什么时候更新才加上的 所以那时候没测试数据 具体多 google
    blacklee
        7
    blacklee  
       2017 年 11 月 27 日   ❤️ 1
    @dbfox 用 Postgres 数据库,简单弄个索引就完事了。

    我自己的笔记本,MacBook Pro Late 2013,2 GHz Intel Core i7,8 GB 1600 MHz DDR3

    在 Rails console 里执行了两条语句,你可以看到所需时间

    [3] pry(main)> PoiBasic.count
    (20053.1ms) SELECT COUNT(*) FROM "poi_basics"
    => 56785460
    [4] pry(main)> PoiBasic.order("latlng <-> point(30.333, 120.222)").limit(50)
    PoiBasic Load (23.5ms) SELECT "poi_basics".* FROM "poi_basics" ORDER BY latlng <-> point(30.333, 120.222) LIMIT 50
    owenliang
        8
    owenliang  
       2017 年 11 月 27 日
    mongo 是可以的。
    xmadi
        9
    xmadi  
       2017 年 11 月 27 日 via iPhone
    redis 和 mongodb 自带地理位置查询
    shenhhd
        10
    shenhhd  
       2017 年 11 月 27 日
    也可以考虑用 Elasticsearch 这个。速度还不错,自带距离。
    dbfox
        11
    dbfox  
    OP
       2017 年 11 月 27 日
    @blacklee 5000 万数据,23.5 毫秒? 这用的是 Postgres ?
    freehere
        12
    freehere  
       2017 年 11 月 27 日
    放到百度地图数据库
    killergun
        13
    killergun  
       2017 年 11 月 27 日
    高德地图不是现成的
    luman
        14
    luman  
       2017 年 11 月 27 日
    可以使用 redis mongo 这些自带地理索引的数据库
    也可以用 geohash 自己实现
    vus520
        15
    vus520  
       2017 年 11 月 27 日   ❤️ 1
    mongodb, redis, postgres, elasticsearch
    dbfox
        16
    dbfox  
    OP
       2017 年 11 月 27 日
    @vus520 目前觉得 redis 使用最简单
    billwsy
        17
    billwsy  
       2017 年 11 月 27 日 via iPhone
    Nearest Neighbor 的那一套方法可以不?
    teddy2725
        18
    teddy2725  
       2017 年 11 月 27 日
    redis es pg
    minvacai
        19
    minvacai  
       2017 年 11 月 27 日
    MongoDB, MySQL 其实都可以的
    fivesmallq
        20
    fivesmallq  
       2017 年 11 月 27 日
    mongo 性能不太好,推荐 es
    xlvecle
        21
    xlvecle  
       2017 年 11 月 27 日
    经典做法,经纬度用 geohash 编码,建一个 R Tree
    QAPTEAWH
        22
    QAPTEAWH  
       2017 年 11 月 27 日
    普通 b-tree 肯定慢,储存 geo 数据有专门的数据结构(大致是个二维 b-tree)。

    主流数据库肯定提供这种机制,文档里查查 spatial、geo 等词就知道了。
    TangMonk
        23
    TangMonk  
       2017 年 11 月 27 日 via Android
    redis 简单是简单,但是不如 gis 嵌入到数据库里面方便(比如说查询 50km 之类的 20 岁女性),用 postgres 就方便的多了。
    honeycomb
        24
    honeycomb  
       2017 年 11 月 27 日
    支持 R 树的数据库,或者现成提供包装好 geo 数据支持的
    这样的功能连 mysql 都有
    mooncakejs
        25
    mooncakejs  
       2017 年 11 月 27 日
    pg 一波流,全文搜索,地理位置,jsonb 都解决了。
    NUT
        26
    NUT  
       2017 年 11 月 27 日 via iPhone
    数据分片,然后并发查询 最后合并结果 速度在大也不虚
    opengps
        27
    opengps  
       2017 年 11 月 28 日
    以前没有知道这么一堆支持地理算法数据库的时候,我用的是关系型 sql server,采用结果不足放大在查的方法,先算经纬度加减 0.001 范围内,根据结果个数是否满足方法 0.001 ,最多放大 10 次,这样实现的。
    sampeng
        28
    sampeng  
       2017 年 11 月 28 日
    elasticsearch,mongodb。专门解决此类问题
    Yang2333
        29
    Yang2333  
       2019 年 10 月 15 日
    码一下
    Yang2333
        30
    Yang2333  
       2019 年 10 月 15 日
    楼主...最后怎么做的呢
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:33 · PVG 03:33 · LAX 11:33 · JFK 14:33
    ♥ Do have faith in what you're doing.