Redis geo 我身边有啥?

我们要做什么?

          每天你在用美团的时候,查找附近的美食,附近的商家,当你每天用共享单车的时候,有没有想过查看你附近的共享单车功能是怎么实现的,对!我们今天分分钟用redis来实现这个功能,Easy的不行不行的。

怎么做?

        只讲实现不说原理,首先你要在本地有个redis,然后打开客户端,你把redis想成一个魔法口袋,把所有的地点坐标都装进去,然后,你就可以问诸如,我附近1000米有啥菜馆的问题。

先打开redis客户端

添加一个坐标或多个

127.0.0.1:6379> geoadd fanguan 116.48105 39.996794 KFC
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.514203 39.905409 麦当劳
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.489033 40.007669 必胜客
(integer) 1
127.0.0.1:6379> geoadd fanguan 116.562108 39.787602 麻辣诱惑 116.334255 40.027400 火锅
(integer) 2

geoadd   是命令

fanguan  是key  是饭馆的拼音 -  -

116.48105 39.996794 是坐标定位

KFC 是饭馆的名称,大家可以存放业务上的主键

现在我们已经添加了1个或多个坐标,查看下我们添加的坐标数据

127.0.0.1:6379> ZRANGE fanguan 0 -1 WITHSCORES
 1) "\xe9\xba\xbb\xe8\xbe\xa3\xe8\xaf\xb1\xe6\x83\x91"
 2) "4069154033428715"
 3) "\xe7\x81\xab\xe9\x94\x85"
 4) "4069880904286516"
 5) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
 6) "4069886008361398"
 7) "KFC"
 8) "4069887154388167"
 9) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
10) "4069887179083478"

哎0 0 除了kfc都是中文乱码

删除一个坐标的命令

127.0.0.1:6379> zrem fanguan 火锅
(integer) 1

输入当前坐标,查看附近的餐馆

127.0.0.1:6379> georadius fanguan 116.514202 39.905409 20 km withdist count 3 asc
1) 1) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
   2) "0.0000"
2) 1) "KFC"
   2) "10.5501"
3) 1) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
   2) "11.5748"

我哭不应该用中文。。。

fanguan    redis key

然后是坐标 ,就可以理解为我的位置

20 km 是说这个坐标20千米之内的点,是范围

count 3 asc 是排序前3个

还有 asc可以换成desc 变成倒叙

三个可选参数 withcoord withdist withhash 用来携带附加参数
 withdist 很有用,它可以用来显示距离

127.0.0.1:6379> georadiusbymember fanguan KFC 20 km withcoord withdist withhash count 3 asc
1) 1) "KFC"
   2) "0.0000"
   3) (integer) 4069887154388167
   4) 1) "116.48104995489120483"
      2) "39.99679348858259686"
2) 1) "\xe5\xbf\x85\xe8\x83\x9c\xe5\xae\xa2"
   2) "1.3878"
   3) (integer) 4069887179083478
   4) 1) "116.48903220891952515"
      2) "40.00766997707732031"
3) 1) "\xe9\xba\xa6\xe5\xbd\x93\xe5\x8a\xb3"
   2) "10.5501"
   3) (integer) 4069886008361398
   4) 1) "116.5142020583152771"
      2) "39.90540918662494363"

其他命令

算2个点距离

127.0.0.1:6379> geodist fanguan KFC 必胜客 km
"1.3878"

距离单位可以是 m、km、 ml、ft,分别代表米、千米、英里和尺。

获取元素位置

geopos 指令可以获取集合中任意元素的经纬度坐标,可以一次获取多个。

127.0.0.1:6379> geopos fanguan KFC 必胜客
1) 1) "116.48104995489120483"
   2) "39.99679348858259686"
2) 1) "116.48903220891952515"
   2) "40.00766997707732031"

获取元素hash值(geo hash)

127.0.0.1:6379> geohash fanguan KFC
1) "wx4gd94yjn0"

总结

           之前写过一个关于算附近的代码,那个是用java自己实现的,还是有漏洞的,不过这次发现redis已经有了这个实现,简直是简单的不得了,不过要注意的是,经纬度存入后,读取的时候有一些小误差,但是不耽误这个算法和功能的实现。

 

 

 

——————————————————————————chenchen————————————————————————

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值