当前位置: 首页 > news >正文

redis的GEO实战

本文主要研究一下redis的GEO的使用

相关命令

geoadd

时间复杂度为O(log(N))

geoadd cityGeo 116.405285 39.904989 "北京"
geoadd cityGeo 121.472644 31.231706 "上海"
复制代码
  • 添加经纬度信息

geopos

时间复杂度为O(log(N))

127.0.0.1:6379> geopos cityGeo 北京
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"
复制代码
  • 查找指定key的经纬度信息,可以指定多个key,批量返回

geodist

时间复杂度为O(log(N))

127.0.0.1:6379> geodist cityGeo 北京 上海
"1067597.9668"
127.0.0.1:6379> geodist cityGeo 北京 上海 km
"1067.5980"
复制代码
  • 返回两个地方的距离,可以指定单位,比如米m,千米km,英里mi,英尺ft

georadius

时间复杂度为O(N+log(M)),N为指定半径范围内的元素个数,M为要返回的个数

georadius cityGeo 116.405285 39.904989 100 km WITHDIST WITHCOORD ASC COUNT 5
复制代码
  • 根据给定的经纬度,返回半径不超过指定距离的元素
  • 可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
  • 可以指定ASC或DESC,根据距离来排序
  • 可以指定COUNT限定返回的记录数

georadiusbymember

时间复杂度为O(log(N)+M),N为指定半径范围内的元素个数,M为要返回的个数

georadiusbymember cityGeo 北京 100 km WITHDIST WITHCOORD ASC COUNT 5
复制代码
  • 根据指定的地点查询半径在指定范围内的位置
  • 可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
  • 可以指定ASC或DESC,根据距离来排序
  • 可以指定COUNT限定返回的记录数

geohash

查找一个位置的时间复杂度为O(log(N))

127.0.0.1:6379> geohash cityGeo 北京
1) "wx4g0b7xrt0"
复制代码
  • 返回的是geohash值

RedisTemplate的GEO使用实例

    @Test
    public void testAdd(){
        Long addedNum = redisTemplate.opsForGeo()
                .add(cityGeoKey,new Point(116.405285,39.904989),"北京");
        System.out.println(addedNum);
    }

    @Test
    public void testGeoGet(){
        List<Point> points = redisTemplate.opsForGeo().position(cityGeoKey,"北京","上海","深圳");
        System.out.println(points);
    }

    @Test
    public void testDist(){
        Distance distance = redisTemplate.opsForGeo()
                .distance(cityGeoKey,"北京","上海", RedisGeoCommands.DistanceUnit.KILOMETERS);
        System.out.println(distance);
    }

    @Test
    public void testNearByXY(){
        //longitude,latitude
        Circle circle = new Circle(116.405285,39.904989, Metrics.KILOMETERS.getMultiplier());
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>>  results = redisTemplate.opsForGeo()
                .radius(cityGeoKey,circle,args);
        System.out.println(results);
    }

    @Test
    public void testNearByPlace(){
        Distance distance = new Distance(5,Metrics.KILOMETERS);
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(5);
        GeoResults<RedisGeoCommands.GeoLocation<String>>  results = redisTemplate.opsForGeo()
                .radius(cityGeoKey,"北京",distance,args);
        System.out.println(results);
    }

    @Test
    public void testGeoHash(){
        List<String> results = redisTemplate.opsForGeo()
                .hash(cityGeoKey,"北京","上海","深圳");
        System.out.println(results);
    }
复制代码
  • 上面分别展示了使用RedisTemplate进行geoadd、geopos、geodist、georadius、georadiusbymember、geohash操作
  • Point的属性值,x轴是经度longitude,y轴是纬度latitude

小结

redis为GEO提供了丰富的操作,RedisTemplate也封装了对应的api,使用起来非常方便。

doc

  • geo
  • geoadd
  • geopos
  • geodist
  • georadius
  • georadiusbymember
  • geohash
  • mongo的geo查询

相关文章:

  • 苹果cms v10安装教程
  • Hadoop迁移MaxCompute神器之DataX-On-Hadoop使用指南
  • CentOS7源码包编译安装php7.2完整版
  • PXE安装与配置
  • 【呆鸟译Py】2018年数据科学家报告
  • jython笔记
  • mpvue 临时关闭eslint
  • ACM-ICPC 2018 焦作赛区网络预赛
  • iOS开发,轻松获取根控制器当前控制器的正确方式
  • set_uid、set_gid、stick_bit、软链接和硬连接文件
  • 0006-20180422-自动化第七章-python基础学习笔记
  • 【计算机网络】OSI七层模型图解
  • Java多线程全揭秘
  • 特殊权限set_uid/ set_gid /stick_bit,软链接、硬链接
  • 源码分析----Mybatis数据源与连接池
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译]CSS 居中(Center)方法大合集
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Angular2开发踩坑系列-生产环境编译
  • css选择器
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • gitlab-ci配置详解(一)
  • Java IO学习笔记一
  • java多线程
  • JS函数式编程 数组部分风格 ES6版
  • Netty源码解析1-Buffer
  • Node 版本管理
  • NSTimer学习笔记
  • Python进阶细节
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Terraform入门 - 1. 安装Terraform
  • Vultr 教程目录
  • 搭建gitbook 和 访问权限认证
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 聊聊flink的BlobWriter
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深入 Nginx 之配置篇
  • 实战|智能家居行业移动应用性能分析
  • 我的面试准备过程--容器(更新中)
  • 移动端解决方案学习记录
  • 阿里云ACE认证之理解CDN技术
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​queue --- 一个同步的队列类​
  • !$boo在php中什么意思,php前戏
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net MVC + EF搭建学生管理系统
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)