利用redis實現位置搜索功能(類似:微信附近的人,根據座標來實現)

利用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
    
    
    # 結果:
    
    "242.3263"
    • 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):
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章