利用redis實現位置搜尋功能(類似:微信附近的人,根據座標來實現)
阿新 • • 發佈:2019-02-15
利用redis實現位置搜尋功能(類似:微信附近的人,根據座標來實現,測試可行,沒實際用到)
1. 利用redis的geo功能
主要功能有:
- geoadd key longitude latitude member … 新增成員經緯度
# 添加了 beijing、tianjin、shijiazhuang、tangshan 的座標到 locations 中 geoadd locations 116.0 39.6 beijing 117.1 39.1 tianjin 114.3 38.0 shijiazhuang 118.0 39.4 tangshan
- geopos key member1 member2 … 顯示成員經緯度
# 顯示成員經緯度 geopos locations member1 member2 # 結果: 1) 1) "116.28000229597091675" 2) "39.5500007245470826" 2) 1) "114.29000169038772583" 2) "38.01999994251037407"
- geodist key member1 member2 km 顯示成員的距離(單位有:)
表示符號 單位 m 米 km 千米 mi 英里 ft 尺 geodist locations beijing shijiazhuang km # 結果:
- georadius key longitude latitude 100 km 找指定經緯度周圍100km之內的點,後面還有引數:
引數 含義 withdist 距離也寫出來 withcoord 座標也顯示出來 withhash 座標的hash值也寫出來 withradius 座標的經緯度也寫出來 ASC、DESC 排序方式,按照距離的 升序、降序排列) COUNT 3 只顯示前3條資料,可以修改該值 store aa 把結果存入aa,zset格式,以座標hash為score storedist bb 把結果存入bb,zset格式,以距離為score georadius locations 117 39 100 km withdist # 結果: 1) 1) "beijing" 2) "87.0941" 2) 1) "tianjin" 2) "13.6619" 3) 1) "tangshan" 2) "96.7842"
- georadiusbymember key member1 100 km 找key中的member1周圍100km的點,後面的引數與georadius一樣
georadiusbymember locations beijing 150 km withcoord # 結果: 1) 1) "beijing" 2) 1) "116.28000229597091675" 2) "39.5500007245470826" 2) 1) "tianjin" 2) 1) "117.12000042200088501" 2) "39.0800000535766543" 3) 1) "tangshan" 2) 1) "118.01000028848648071" 2) "39.37999951111137165"
- zrem key member2 刪除key中的member2,geo也是利用有序列表zset來實現的,其以座標的hash值為member的score
2. 在django中使用該功能
- 需要用到 django_redis 模組
# 安裝
pip install django-redis
# 使用
from django_redis import get_redis_connection
conn = get_redis_connection("default")
# 下面是django中對應上面的方法的使用方法,註釋掉的部分是django中該方法的引數,與redis中的略有不同
conn.geoadd(...)
# def geoadd(self, name, *values):
conn.geopos(...)
# def geopos(self, name, *values):
conn.geohash(...)
# def geohash(self, name, *values):
conn.geodist(...)
# def geodist(self, name, place1, place2, unit=None):
conn.georadius(...)
# def georadius(self, name, longitude, latitude, radius, unit=None,
# withdist=False, withcoord=False, withhash=False, count=None,
# sort=None, store=None, store_dist=None):
conn.georadiusbymember(...)
# def georadius(self, name, place, radius, unit=None,
# withdist=False, withcoord=False, withhash=False,
# count=None, sort=None, store=None, store_dist=None):
conn.zrem(...)
# def zrem(self, name, *values):