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

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

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

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