在之前的《redis特殊数据类型之stream》文章中给大家介绍了关于数据类型stream的相关内容,本篇文章给大家带来了redis中的另一种数据类型geospatial,下面一起来看一下,希望对大家有帮助。
推荐学习:redis视频教程
前言我们都知道 redis 提供了丰富的数据类型,特殊的有四种:bitmap、hyperloglog、geospatial、stream。
今天我们就来详细的聊聊 redis 这四种特殊的数据类型之一 geospatial;
应用场景:存储地理位置信息的场景,比如滴滴叫车;
概述简介
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
redis geospatial 是 redis 3.2 版本新增的数据类型,主要用于存储地理位置信息,并对存储的信息进行操作。
在日常生活中,我们越来越依赖搜索 “附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(location-based service,lbs)的应用。lbs 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,geo 就非常适合应用在 lbs 服务的场景中。
内部实现geo 本身并没有设计新的底层数据结构,而是直接使用了 sorted set 集合类型。
geo 类型使用 geohash 编码方法实现了经纬度到 sorted set 中元素权重分数的转换,这其中的两个关键机制就是「对二维地图做区间划分」和「对区间进行编码」。一组经纬度落在某个区间后,就用区间的编码值来表示,并把编码值作为 sorted set 元素的权重分数。
这样一来,我们就可以把经纬度保存到 sorted set 中,利用 sorted set 提供的“按权重进行有序范围查找”的特性,实现 lbs 服务中频繁使用的“搜索附近”的需求。
常用命令# 存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。geoadd key longitude latitude member [longitude latitude member ...]# 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。geopos key member [member ...]# 返回两个给定位置之间的距离。geodist key member1 member2 [m|km|ft|mi]# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count] [asc|desc] [store key] [storedist key]
应用场景滴滴叫车
这里以滴滴叫车的场景为例,介绍下具体如何使用 geo 命令:geoadd 和 georadius 这两个命令。
假设车辆 id 是 33,经纬度位置是(116.034579,39.030452),我们可以用一个 geo 集合保存所有车辆的经纬度,集合 key 是 cars:locations。
执行下面的这个命令,就可以把 id 号为 33 的车辆的当前经纬度位置存入 geo 集合中:
geoadd cars:locations 116.034579 39.030452 33
当用户想要寻找自己附近的网约车时,lbs 应用就可以使用 georadius 命令。
例如,lbs 应用执行下面的命令时,redis 会根据输入的用户的经纬度信息(116.054579,39.030452 ),查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 lbs 应用。
georadius cars:locations 116.054579 39.030452 5 km asc count 10
推荐学习:redis视频教程
以上就是redis特殊数据类型之geospatial的详细内容。