1、Geo指令的基本用法
Redis提供的Geo指令只有6个,读者们瞬间就可以掌握。使用时,读者务必想到,它只是一个普通的zset结构。下面的例子将使用下图的5个公司的地理位置。
![](https://img.haomeiwen.com/i4337694/7ddc62f4b87768d0.png)
(一)增加
geoadd指令携带集合名称以及多个经纬度名称三元组,注意这里可以加入多个三元组。
![](https://img.haomeiwen.com/i4337694/e909ef08ad5c32b3.png)
也许你会为为什么Redis没有提供Geo元素删除指令?前面我们提到Geo存储结构上使用的是zset,意味这我们可以使用zset相关的指令来操作Geo数据,所以元素删除指令可以直接使用zrem指令即可。
(二)距离
geodist指令可以用来计算两个元素之前的距离,携带集合名称、两个名称和距离单位。
![](https://img.haomeiwen.com/i4337694/02092ad4d506dce3.png)
我们可以看到掘金离美团最近,因为它们都在望京。距离单位可以是m、km、ml和ft,分别代表米、千米、英里和尺。
(三)获取元素位置
geopos指令可以获取集合中任意元素的经纬度坐标,可以一次获取多个。
![](https://img.haomeiwen.com/i4337694/74bc3da2354c2e21.png)
我们观察到获取的经纬度坐标和geoadd进去的坐标有少许误差,原因是GeoHash对二维坐标进行的一维映射是有损的,通过映射再还原回来的值会出现较小的差别。对于“附近的人”这种功能来说,这点儿误差完全可以接受。
(四)获取元素的hash值
GeoHash可以获取元素的经纬度编码字符串,你可以使用这个编码值去http://geohash.org/${hash}上进行直接定位,它是GeoHash的标准编码值。
![](https://img.haomeiwen.com/i4337694/3e6cfd7b8c78c752.png)
(五)附近的公司
georadiusbymember指令是最为关键的指令之一,它可以用来查询指定元素附近的其他元素,它的参数非常复杂。
![](https://img.haomeiwen.com/i4337694/92c703ce33f53cc7.png)
除了georadiusbymember指令根据元素查询附近的元素,Redis还提供了根据坐标值来查询附近的元素的指令georadius,这个指令更加有用,它可以根据用户的定位来计算“附近的车”“附近的餐馆”等。它的参数和georadiusbymember基本一致,唯一的差别是将目标元素改成经纬度坐标值。
![](https://img.haomeiwen.com/i4337694/fe22bc45fee27a6e.png)
2、注意事项
在一个地图应用中,车的数据、餐馆的数据、人的数据可能会有几百万条甚至几千万条,如果使用Redis的Geo数据结构,它们将被全部放在一个zset集合中。在Redis的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个key的数据过大,会对集群的迁移工作造成较大影响,在集群环境中单个key对应的数据库不宜超过1MB,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。
所以,这里建议Geo的数据使用单独的Redis实例部署,不使用集群环境。如果数据量过亿个,甚至更大,就需要对Geo数据进行拆分,按国家拆分、按省份拆分、按市拆分,在人口特大城市甚至可以按区拆分,这样就可以显著降低单个zset集合的大小。
网友评论