Redis新特性GEOHASH

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

一、简言

    Redis 的 GEO 特性将在 Redis 3.2 版本释出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作   

    将指定的地理空间项目(纬度,经度,名称)添加到指定的键。数据作为排序集存储到密钥中,使得可以使用GEORADIUS或GEORADIUSBYMEMBER命令使用半径查询稍后检索项目。

    该命令采用标准格式x,y的参数,因此必须在纬度之前指定经度。可以索引的坐标有限制:非常靠近极点的区域不可索引。如EPSG:900913 / EPSG:3785 / OSGEO:41001规定的具体限值如下:

    有效经度为-180至180度。

    有效纬度为-85.05112878至85.05112878度。

    注意:没有GEODEL命令,可以使用ZREM来删除元素。地理索引结构只是一个排序集。

二、Redis GEO实现

    Redis GEO实现主要包含了以下两项技术:

    1、使用geohash保存地理位置的坐标。

    2、使用有序集合(zset)保存地理位置的集合。


三、GEOHASH

    geohash的思想是将二维的经纬度转换成一维的字符串,geohash有以下三个特点:

1、字符串越长,表示的范围越精确。编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右。

2、字符串相似的表示距离相近,利用字符串的前缀匹配,可以查询附近的地理位置。这样就实现了快速查询某个坐标附近的地理位置。

3、geohash计算的字符串,可以反向解码出原来的经纬度。


四、GEOHASH命令语法

    1、geoadd 用来增加地理位置的坐标,可以批量添加地理位置,其格式为:

        GEOADD key longitude latitude member [longitude latitude member ...]

        字段的介绍:

        key标识一个地理位置的集合。longitude latitude member标识了一个地理位置的坐标。longitude是地理位置的经度,latitude是地理位置的纬度。

        member是该地理位置的名称。GEOADD可以批量给集合添加一批地理位置

        egg:GEOADD beijing-area 39.8865577059 116.2161254883 shijingshan

    2、geopos 可以获取地理位置的坐标,可以批量获取多个地理位置的坐标,命令格式为:

        GEOPOS key member [member ...]


    3、geodist 用来获取两个地理位置的距离,命令格式为:

        单位可以指定为以下四种类型:

        m:米,距离单位默认为米,不传递该参数则单位为米。

        km:公里。

        mi:英里。

        ft:英尺。

    4、georadius 可以根据给定地理位置坐标获取指定范围内的地理位置集合。命令格式为:

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

        longitude latitude标识了地理位置的坐标,radius表示范围距离,距离单位可以为m|km|ft|mi,还有一些可选参数:

WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。

WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。

ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。

WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。

COUNT count:传入COUNT参数,可以返回指定数量的结果。

    5、georadiusbymember  可以根据给定地理位置获取指定范围内的地理位置集合。georadius命令传递的是坐标,georadiusbymember传递的是地理位置。georadius更为灵活,

可以获取任何坐标点范围内的地理位置。但是大多数时候,只是想获取某个地理位置附近的其他地理位置,使用georadiusbymember则更为方便。

        georadiusbymember命令格式为(命令可选参数与georadius含义一样):

          georadiusbymember key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]


###命令示例

1、单一添加区域

GEOADD beijing-area 116.2161254883 39.8865577059 shijingshan 

批量添加区域

geoadd Beijing-areas 116.2161254883 39.8865577059 ShiJingShan 116.1611938477 39.7283134103 FangShan 116.3534545898 39.7071866568 DaXing 116.4166259766 39.9097362345 DongChenQu

2、查看已经添加的地理信息,可以单个member或多个查询

    192.168.1.130:6379> geopos Beijing-areas ShiJingShan FangShan

    1) 1) "116.21612817049026489"

       2) "39.88655846536294547"

    2) 1) "116.16119652986526489"

       2) "39.72831328866426048"

3、GEODIST命令来实现计算两个位置之间的距离,通过已存在的KEY下的2个位置计算距离,单位的距离有m米km千米等

192.168.1.130:6379> geodist Beijing-areas ShiJingShan FangShan m

"18216.0860"

4、georadius查看当前位置的附近的所有位置 以及参数使用:[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

添加测试数据:

geoadd beijing 116.6638183594 39.8928799003 tongzhou

geoadd beijing 116.3534545898 39.7071866568 daxing

geoadd beijing 116.2161254883 39.8865577059 shijingshan

geoadd beijing 116.1611938477 39.7283134103 fangshan

georadius beijing 116.6875076294 39.8953822745 5000 m

       1、统计5000m范围内附近的位置取最远一个位置

        georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC ##ASC 当前位置最近的位置排序,当使用count类似limit

       2、统计5000m范围内附近的位置取最远一个位置相差的距离--withdist 当前位置相差的距离计算

          georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC withdist   

       3、统计5000m范围内附近的位置并显示的经纬度信息 ---withcoord 显示经纬度  

        georadius beijing 116.6875076294 39.8953822745 50000 m  DESC withcoord 

4、georadiusbymember 显示已添加的某个位置为中心点的距离多少范围内的信息。

    192.168.1.130:6379> georadiusbymember beijing shijingshan 5000 m

    1) "shijingshan"

    192.168.1.130:6379> georadiusbymember beijing shijingshan 50000 m

    1) "shijingshan"

    2) "tongzhou"

    3) "fangshan"

    4) "daxing" 


本文转自 DBAspace 51CTO博客,原文链接:http://blog.51cto.com/dbaspace/1981307

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 缓存 NoSQL
聊聊 Redis 的高级特性之一: 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 图中,消费者1和消费者2 订阅了 Redis 服务的频道 channel ,当生产者通过 PUBLISH 命令发送给频道 channel 时, 这个消息就会被发送给订阅它的两个客户端。
聊聊 Redis 的高级特性之一: 发布订阅
|
19天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
53 10
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
27 2
|
1月前
|
存储 消息中间件 NoSQL
【redis】redis的特性和主要应用场景
【redis】redis的特性和主要应用场景
103 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
203 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
4月前
|
消息中间件 缓存 NoSQL
Redis快速度特性及为什么支持多线程及应用场景
Redis快速度特性及为什么支持多线程及应用场景
110 11
|
3月前
|
NoSQL Java 调度
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
|
3月前
|
NoSQL 网络协议 安全
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
|
5月前
|
监控 NoSQL 网络安全
Redis 6和7:探索新版本中的新特性
Redis 6和7:探索新版本中的新特性
|
6月前
|
存储 NoSQL 关系型数据库
redis-学习笔记(概念, 相关名词, 特性, 优势: 快)
redis-学习笔记(概念, 相关名词, 特性, 优势: 快)
38 0