您現(xiàn)在的位置是:首頁 >學(xué)無止境 >用Redis實現(xiàn)“附近的人”功能網(wǎng)站首頁學(xué)無止境
用Redis實現(xiàn)“附近的人”功能
自Redis 3.2開始,Redis基于geohash和有序集合提供了地理位置相關(guān)功能。 Redis Geo模塊包含了以下6個命令:
GEOADD: 將給定的位置對象(緯度、經(jīng)度、名字)添加到指定的key;
GEOPOS: 從key里面返回所有給定位置對象的位置(經(jīng)度和緯度);
GEODIST: 返回兩個給定位置之間的距離;
GEOHASH: 返回一個或多個位置對象的Geohash表示;
GEORADIUS: 以給定的經(jīng)緯度為中心,返回目標集合中與中心的距離不超過給定最大距離的所有位置對象;
GEORADIUSBYMEMBER: 以給定的位置對象為中心,返回與其距離不超過給定最大距離的所有位置對象。
其中,組合使用GEOADD和GEORADIUS可實現(xiàn)“附近的人”中“增”和“查”的基本功能。
要實現(xiàn)微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。
其中“給定的位置對象”即為用戶本人,搜索的對象為其他用戶。
不過本質(zhì)上,GEORADIUSBYMEMBER = GEOPOS + GEORADIUS,即先查找用戶位置再通過該位置搜索附近滿足位置相互距離條件的其他用戶對象。
GEOADD
GEOADD key 116.410377 39.93491 張三 [lon lat name ...]
將給定的位置對象(緯度、經(jīng)度、名字)添加到指定的key。
其中,key為集合名稱,name為該經(jīng)緯度所對應(yīng)的對象。
在實際運用中,當所需存儲的對象數(shù)量過多時,可通過設(shè)置多key(如一個省一個key)的方式對對象集合變相做sharding,避免單集合數(shù)量過多。
GEORADIUS
GEORADIUS key lon lat radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] [STORE key] [STORedisT key]
以給定的經(jīng)緯度為中心,返回目標集合中與中心的距離不超過給定最大距離的所有位置對象。
范圍單位:m | km | ft | mi --> 米 | 千米 | 英尺 | 英里
額外參數(shù):
- WITHDIST:在返回位置對象的同時,將位置對象與中心之間的距離也一并返回。距離的單位和用戶給定的范圍單位保持一致。
- WITHCOORD:將位置對象的經(jīng)度和維度也一并返回。
- WITHHASH:以 52 位有符號整數(shù)的形式,返回位置對象經(jīng)過原始 geohash 編碼的有序集合分值。
- ASC|DESC:從近到遠返回位置對象元素 | 從遠到近返回位置對象元素。
- COUNT count:選取前N個匹配位置對象元素。(不設(shè)置則返回所有元素)
- STORE key:將返回結(jié)果的地理位置信息保存到指定key。
- STORedisT key:將返回結(jié)果離中心點的距離保存到指定key。
作者:萬汨
簡介:餓了么資深開發(fā)工程師。iOS,Go,Java 均有涉獵。目前主攻大數(shù)據(jù)開發(fā)。喜歡騎行、爬山。
編輯:陶家龍、孫淑娟
出處:餓了么物流技術(shù)團隊
原文鏈接:https://juejin.im/post/5da40462f265da5baf410a11