geohash美团附近酒店搜索-技术方案

美团附近酒店搜索-技术方案

自Redis 3.2开始,Redis基于geohash和zset提供了地理位置相关功能。
什么是Geohash
Geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串。比如,世界之窗的编码是ws101xy1rp0。

Redis Geo模块包含了以下6个命令:

GEOADD

将给定的位置对象(纬度、经度、名字)添加到指定的key;

39.100.196.99:6379> geoadd hotel 113.9807127428 22.5428248089 "世界之窗" 113.9832042690 22.5408496326 "南山威尼斯酒店" 114.0684865267 22.5412294122 "福田喜来登酒店" 114.3135524539 22.5999265998 "大梅沙海景酒店" 113.9349465491 22.5305488659 "南山新年酒店" 114.0926367279 22.5497917634 "深圳华强广场酒店"
6
39.100.196.99:6379> zrange hotel 0 -1
南山新年酒店
世界之窗
南山威尼斯酒店
福田喜来登酒店
深圳华强广场酒店
大梅沙海景酒店

注:

  1. 这里我们采用的是中文存储,如果出现了乱码,redis命令的登录命令加上 --raw
    例如: ./redis-cli --raw
  2. 查看某个地址的经纬度,建议用 http://www.gpsspg.com/maps.htm,本课程就是用这个网址查出某个地址的具体经纬度
GEOPOS

从key里面返回所有给定位置对象的位置(经度和纬度);

39.100.196.99:6379> GEOPOS hotel "世界之窗"
113.98071080446243286
22.54282525199023013
GEOHASH:

返回一个或多个位置对象的Geohash表示;

39.100.196.99:6379> GEOHASH hotel "世界之窗"
ws101xy1rp0
GEODIST key member1 member2 [unit]

返回两个给定位置之间的距离;
指定单位的参数 unit 必须是以下单位的其中一个:
– m 表示单位为米。
– km 表示单位为千米。
– mi 表示单位为英里。
– ft 表示单位为英尺。

39.100.196.99:6379> GEODIST hotel "世界之窗"  "南山威尼斯酒店" m
337.4887
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

给定一个经纬度,然后以半径为中心,计算出半径内的数据。

39.100.196.99:6379> GEORADIUS hotel 113.9410499639 22.5461508801 10 km WITHDIST WITHCOORD count 10
南山新年酒店
1.8451
113.93494695425033569
22.53054959741555052
世界之窗
4.0910
113.98071080446243286
22.54282525199023013
南山威尼斯酒店
4.3704
113.98320525884628296
22.54085070420710224

– WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
– WITHCOORD: 将位置元素的经度和维度也一并返回。
– WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
– ASC、DESC 排序方式,按照距离的 升序、降序排列
– STORE key1 把结果存入key1,zset格式,以坐标hash为score
– STOREDIST key2 把结果存入key2,zset格式,以距离为score

GEORADIUSBYMEMBER key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

GEORADIUSBYMEMBER 和 GEORADIUS 一样的功能,区别在于,GEORADIUS是以经纬度去查询,而GEORADIUSBYMEMBER是以当前集合中的某个member元素来查询

39.100.196.99:6379> GEORADIUSBYMEMBER hotel "世界之窗" 10 km WITHDIST WITHCOORD count 10
世界之窗
0.0000
113.98071080446243286
22.54282525199023013
南山威尼斯酒店
0.3375
113.98320525884628296
22.54085070420710224
南山新年酒店
4.8957
113.93494695425033569
22.53054959741555052
福田喜来登酒店
9.0190
114.06848877668380737
22.54122837765984144

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值