Redis详解之特殊数据类型GEO及底层数据结构

2021/10/1 19:11:20

本文主要是介绍Redis详解之特殊数据类型GEO及底层数据结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:一共就只有这几个方法

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。

 这是一个官方提供的例子,我只不过是将名字换成了上海和北京,经度纬度的话可以在线索索。但是如果实际应用的话肯定不会手动添加的,会使用接口直接导入,geodist就是返回两点之间的距离,我这个经纬度和城市是不匹配的,所以只要经纬度对的话,求出来的距离误差会很小,默认的单位是米。

redis> GEOADD china:city 13.361389 38.115556 "shanghai" 15.087269 37.502669 "chongqing"
(integer) 2
redis> GEODIST china:city shanghai chongqing
"166274.15156960039"
redis> GEORADIUS china:city 15 37 100 km
1) "Catania"
redis> GEORADIUS china:city 15 37 200 km
1) "Palermo"
2) "Catania"
redis> 
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

    georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。也就是说georadius是自定义经度纬度,而georadiusbymember是根据已有的城市来决定,可以附带下列参数

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。

redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"
redis> 

geohash:

该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:

  1. 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
  2. 它可以在 geohash.org 网站使用,网址 http://geohash.org/<geohash-string>。查询例子:Geohash - geohash.org/sqdtr74hyu0.
  3. 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"
redis> 

虽然这个geo特殊类型比较简单,但是 实际应用非常多,例如附近的人,两个人之间的距离等等,但是我们需要注意的是geo的底层数据结构,他的底层数据结构为zset,也就是官方文档中的Sorted Sets 有序集合,那么也就是说zset的命令对geo同样有效,关于zset会在另一篇博客写。

还是如果有错误请联系!!!!



这篇关于Redis详解之特殊数据类型GEO及底层数据结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程