• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aidevs
V2EX  ›  程序员

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

  •  
  •   aidevs · Nov 27, 2017 · 5197 views
    This topic created in 3094 days ago, the information mentioned may be changed or developed.
    V 友一般都有哪些好的技术方案?
    30 replies    2019-10-15 23:24:56 +08:00
    warlock
        1
    warlock  
       Nov 27, 2017
    GeoHash
    aidevs
        2
    aidevs  
    OP
       Nov 27, 2017
    发现 redis 有这样的功能

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

    命令描述:

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

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

    m 表示单位为米。
    km 表示单位为千米。
    mi 表示单位为英里。
    ft 表示单位为英尺。
    blacklee
        3
    blacklee  
       Nov 27, 2017
    你有多少用户?
    aidevs
        4
    aidevs  
    OP
       Nov 27, 2017
    @blacklee 20 万
    Immortal
        5
    Immortal  
       Nov 27, 2017
    以前看过一个早期的文章 年代有点久远 LZ 可以重新测试和评估
    https://ruby-china.org/topics/22059
    Immortal
        6
    Immortal  
       Nov 27, 2017
    你说的 redis geo 功能 是去年还是什么时候更新才加上的 所以那时候没测试数据 具体多 google
    blacklee
        7
    blacklee  
       Nov 27, 2017   ❤️ 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  
       Nov 27, 2017
    mongo 是可以的。
    xmadi
        9
    xmadi  
       Nov 27, 2017 via iPhone
    redis 和 mongodb 自带地理位置查询
    shenhhd
        10
    shenhhd  
       Nov 27, 2017
    也可以考虑用 Elasticsearch 这个。速度还不错,自带距离。
    aidevs
        11
    aidevs  
    OP
       Nov 27, 2017
    @blacklee 5000 万数据,23.5 毫秒? 这用的是 Postgres ?
    freehere
        12
    freehere  
       Nov 27, 2017
    放到百度地图数据库
    killergun
        13
    killergun  
       Nov 27, 2017
    高德地图不是现成的
    luman
        14
    luman  
       Nov 27, 2017
    可以使用 redis mongo 这些自带地理索引的数据库
    也可以用 geohash 自己实现
    vus520
        15
    vus520  
       Nov 27, 2017   ❤️ 1
    mongodb, redis, postgres, elasticsearch
    aidevs
        16
    aidevs  
    OP
       Nov 27, 2017
    @vus520 目前觉得 redis 使用最简单
    billwsy
        17
    billwsy  
       Nov 27, 2017 via iPhone
    Nearest Neighbor 的那一套方法可以不?
    teddy2725
        18
    teddy2725  
       Nov 27, 2017
    redis es pg
    minvacai
        19
    minvacai  
       Nov 27, 2017
    MongoDB, MySQL 其实都可以的
    fivesmallq
        20
    fivesmallq  
       Nov 27, 2017
    mongo 性能不太好,推荐 es
    xlvecle
        21
    xlvecle  
       Nov 27, 2017
    经典做法,经纬度用 geohash 编码,建一个 R Tree
    QAPTEAWH
        22
    QAPTEAWH  
       Nov 27, 2017
    普通 b-tree 肯定慢,储存 geo 数据有专门的数据结构(大致是个二维 b-tree)。

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