Redis GEO

redis 在3.2版本中,里面新增的一个功能就是对GEO(地理位置)的支持。

什么是GEO?

地理信息定位,将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。

GEOADD key longitude latitude member [longitude latitude member …]

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

描述位置信息
小明-武汉114.3268023922 30.5508726136
小红-岳阳113.1207328152 29.3744088541
小王-北京116.4990386322 39.7410012807
小惠-武汉114.3268023922 30.5508726136
小花-南昌115.9057517406 28.5555782472
127.0.0.1:6379> geoadd geokey 114.3268023922 30.5508726136 xiaoming
(integer) 0
127.0.0.1:6379> geoadd geokey 113.1207328152 29.3744088541 xiaohong 116.4990386322 39.7410012807 xiaowang 114.3268023922 30.5508726136 xiaohui 115.9057517406 28.5555782472 xiaohua
(integer) 4

GEOPOS key member [member …]

从key里返回所有给定位置元素的位置(经度和纬度)。

127.0.0.1:6379> geopos geokey xiaohui
1) 1) "114.326801598072052"
   2) "30.55087373425730846"

GEODIST key member1 member2 [unit]

返回两个给定位置之间的距离。

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

127.0.0.1:6379> geopos geokey xiaohui
1) 1) "114.326801598072052"
   2) "30.55087373425730846"
127.0.0.1:6379> geodist geokey xiaoming xiaohong m
"175009.6107"
127.0.0.1:6379> geodist geokey xiaoming xiaohong km
"175.0096"

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

范围可以使用以下其中一个单位:

m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
在给定以下可选项时, 命令会返回额外的信息:

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

127.0.0.1:6379> georadius geokey 114.3268023922 30.5508726136 500 km WITHDIST WITHCOORD
1) 1) "xiaohua"
   2) "269.4195"
   3) 1) "115.90575367212295532"
      2) "28.55557925844308187"
2) 1) "xiaohong"
   2) "175.0096"
   3) 1) "113.12073022127151489"
      2) "29.37440825536172895"
3) 1) "xiaohui"
   2) "0.0001"
   3) 1) "114.326801598072052"
      2) "30.55087373425730846"
4) 1) "xiaoming"
   2) "0.0001"
   3) 1) "114.326801598072052"
      2) "30.55087373425730846"

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

指定成员的位置被用作查询的中心。

127.0.0.1:6379> GEORADIUSBYMEMBER geokey xiaoming 10 km withdist withcoord
1) 1) "xiaohui"
   2) "0.0000"
   3) 1) "114.326801598072052"
      2) "30.55087373425730846"
2) 1) "xiaoming"
   2) "0.0000"
   3) 1) "114.326801598072052"
      2) "30.55087373425730846"

实际应用

geo 可以应用在,按照距离排序,查找附近的店铺,根据用户位中心,根据排序 展示数据。

之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  4. Redis 五种常见的数据结构:Set
  5. Redis 五种常见的数据结构:zset

Redis 坚持第五天 :Redis 客户端:Jredis 和 spring-data-redis 整合。
Redis 坚持第六天 :Redis 慢查询日志。
Redis 坚持第七天 :Redis pipeline。
Redis 坚持第八天 :Redis 发布订阅。
Redis 坚持第九天 :Redis bitmp。
Redis 坚持第十天 :Redis HyperLogLogs。
Redis 坚持第十一天 :Redis GEO。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java小小星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值