V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dbfox
V2EX  ›  程序员

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

  •  
  •   dbfox · 2017-11-27 14:07:57 +08:00 · 4337 次点击
    这是一个创建于 2552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    V 友一般都有哪些好的技术方案?
    30 条回复    2019-10-15 23:24:56 +08:00
    warlock
        1
    warlock  
       2017-11-27 14:08:53 +08:00
    GeoHash
    dbfox
        2
    dbfox  
    OP
       2017-11-27 14:26:48 +08:00
    发现 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 14:31:04 +08:00
    你有多少用户?
    dbfox
        4
    dbfox  
    OP
       2017-11-27 14:35:54 +08:00
    @blacklee 20 万
    Immortal
        5
    Immortal  
       2017-11-27 14:37:31 +08:00
    以前看过一个早期的文章 年代有点久远 LZ 可以重新测试和评估
    https://ruby-china.org/topics/22059
    Immortal
        6
    Immortal  
       2017-11-27 14:38:21 +08:00
    你说的 redis geo 功能 是去年还是什么时候更新才加上的 所以那时候没测试数据 具体多 google
    blacklee
        7
    blacklee  
       2017-11-27 14:40:30 +08:00   ❤️ 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 14:41:28 +08:00
    mongo 是可以的。
    xmadi
        9
    xmadi  
       2017-11-27 15:04:10 +08:00 via iPhone
    redis 和 mongodb 自带地理位置查询
    shenhhd
        10
    shenhhd  
       2017-11-27 15:08:37 +08:00
    也可以考虑用 Elasticsearch 这个。速度还不错,自带距离。
    dbfox
        11
    dbfox  
    OP
       2017-11-27 15:09:50 +08:00
    @blacklee 5000 万数据,23.5 毫秒? 这用的是 Postgres ?
    freehere
        12
    freehere  
       2017-11-27 15:20:44 +08:00
    放到百度地图数据库
    killergun
        13
    killergun  
       2017-11-27 15:25:56 +08:00
    高德地图不是现成的
    sunjiayao
        14
    sunjiayao  
       2017-11-27 15:29:42 +08:00
    可以使用 redis mongo 这些自带地理索引的数据库
    也可以用 geohash 自己实现
    vus520
        15
    vus520  
       2017-11-27 15:38:47 +08:00   ❤️ 1
    mongodb, redis, postgres, elasticsearch
    dbfox
        16
    dbfox  
    OP
       2017-11-27 16:36:36 +08:00
    @vus520 目前觉得 redis 使用最简单
    billwsy
        17
    billwsy  
       2017-11-27 16:55:38 +08:00 via iPhone
    Nearest Neighbor 的那一套方法可以不?
    teddy2725
        18
    teddy2725  
       2017-11-27 17:14:32 +08:00
    redis es pg
    minvacai
        19
    minvacai  
       2017-11-27 17:22:12 +08:00
    MongoDB, MySQL 其实都可以的
    fivesmallq
        20
    fivesmallq  
       2017-11-27 17:22:54 +08:00
    mongo 性能不太好,推荐 es
    xlvecle
        21
    xlvecle  
       2017-11-27 17:27:11 +08:00
    经典做法,经纬度用 geohash 编码,建一个 R Tree
    QAPTEAWH
        22
    QAPTEAWH  
       2017-11-27 17:30:22 +08:00
    普通 b-tree 肯定慢,储存 geo 数据有专门的数据结构(大致是个二维 b-tree)。

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