利用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):
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值