技术问题: APP 需要做一个附近的人的功能,怎么做呢?数据库没法查性能也差(已知在线用户经纬度) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dbfox
V2EX    程序员

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

  •  
  •   dbfox 2017-1-27 14:07:57 +08:00 4799 次点击
    这是一个创建于 2898 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
      nbsp;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
    高德地图不是现成的
    /tr>
    luman
        14
    luman  
       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  
      &nbs;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     Solana     3712 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 92ms UTC 10:24 PVG 18:24 LAX 02:24 JFK 05:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86