您现在的位置是:首页 >学无止境 >用Redis实现“附近的人”功能网站首页学无止境

用Redis实现“附近的人”功能

饿了么物流技术团队 2019-11-24 22:56:42
简介针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。

自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。 Redis Geo模块包含了以下6个命令:

  • GEOADD: 将给定的位置对象(纬度、经度、名字)添加到指定的key;

  • GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度);

  • GEODIST: 返回两个给定位置之间的距离;

  • GEOHASH: 返回一个或多个位置对象的Geohash表示;

  • GEORADIUS: 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象;

  • GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。

其中,组合使用GEOADD和GEORADIUS可实现“附近的人”中“增”和“查”的基本功能。

要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。

其中“给定的位置对象”即为用户本人,搜索的对象为其他用户。

不过本质上,GEORADIUSBYMEMBER = GEOPOS + GEORADIUS,即先查找用户位置再通过该位置搜索附近满足位置相互距离条件的其他用户对象。

GEOADD

GEOADD key 116.410377 39.93491 张三 [lon lat name ...]

将给定的位置对象(纬度、经度、名字)添加到指定的key。

其中,key为集合名称,name为该经纬度所对应的对象。

在实际运用中,当所需存储的对象数量过多时,可通过设置多key(如一个省一个key)的方式对对象集合变相做sharding,避免单集合数量过多。

GEORADIUS

GEORADIUS key lon lat radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] [STORE key] [STORedisT key]

以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象。

范围单位:m | km | ft | mi --> 米 | 千米 | 英尺 | 英里
额外参数:

- WITHDIST:在返回位置对象的同时,将位置对象与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。

- WITHCOORD:将位置对象的经度和维度也一并返回。

- WITHHASH:以 52 位有符号整数的形式,返回位置对象经过原始 geohash 编码的有序集合分值。

- ASC|DESC:从近到远返回位置对象元素 | 从远到近返回位置对象元素。

- COUNT count:选取前N个匹配位置对象元素。(不设置则返回所有元素)

- STORE key:将返回结果的地理位置信息保存到指定key。

- STORedisT key:将返回结果离中心点的距离保存到指定key。


作者:万汨

简介:饿了么资深开发工程师。iOS,Go,Java 均有涉猎。目前主攻大数据开发。喜欢骑行、爬山。

编辑:陶家龙、孙淑娟

出处:饿了么物流技术团队

原文链接:https://juejin.im/post/5da40462f265da5baf410a11

梦想加空间!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。