redis日常使用之geo

解珍
• 阅读 3385

参考网址


环境要求

  • 首先确保已经安装redis 并且已经启动

    redis日常使用之geo
  • 确保PHP已经安装redis扩展

    php -m | grep redis
    redis日常使用之geo

redis相关命令整体一览

  • GEOADD
  • GEODIST
  • GEORADIUS
  • GEORADIUSBYMEMBER
  • GEOHASH

GEOADD 插入命令

命令: GEOADD key longitude latitude member [longitude latitude member …]

命令详解 
- 顾名思义这是一个添加命令
1.向一个geo类型的有序集合中添加数据  
2.可以传递多个参数 同时添加
3.经纬度限制
    有效的经度介于 -180 度至 180 度之间
    有效的纬度介于 -85.05112878 度至 85.05112878 度之间
2.返回成功添加到键中的空间元素 不包含已经存在但是更新的元素  

注意:
1.必须按照x,y格式 经度在前 纬度灾后  

命令使用

- 首先打开客户端

正确添加
# geoadd myplace 116.580799 39.929301 me 116.580691 39.929007 you 116.58101 39.928931 other  

错误示范
# geoadd test 181 181 one

redis日常使用之geo
redis日常使用之geo

php中调用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

// 插入正确数据
$successRes = $redis->geoAdd(
    'myplace', // 键值
    116.580799, 39.929301, 'me', // 第一个元素的经纬度 以及对应名称
    116.580691,39.929007, 'you',
    116.58101, 39.928931, 'other'
);

// 插入错误数据
$faildRes = $redis->geoAdd(
    'test',
    181, 181, 'one'
);

var_dump($successRes);
var_dump($faildRes);

redis日常使用之geo

GEOPOS 获取指定元素的位置

命令:GEOPOS key member [member …]

命令详解:

- 获取位置 百度翻译说pos可能是位置的缩写
1.返回一个键中给定元素的位置
2.参数可以传递多个 
3.返回参数每一项都由两个元素组成 第一个元素为经度 第二个元素为纬度
4.如果给定元素不存在 返回nil  

命令使用

正确使用
# geopos myplace me you other  

错误使用 获取一个不存在元素
# geopos myplace one

redis日常使用之geo

PHP中使用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

// 获取正确数据
$successRes = $redis->geoPos(
    'myplace', // 键值
    'me' // 元素名称
);

// 获取错误数据
$faildRes = $redis->geoPos(
    'myplace', // 键值
    'one' // 不存在的元素
);

var_dump($successRes);
var_dump($faildRes);

redis日常使用之geo

GEODIST 获取两个元素之间的距离

命令: GEODIST key member1 member2 [unit]

命令详解
- 获取两个元素之间的距离 dist 距离
1.参数固定 只能计算两个元素之间的距离
2.最后一个参数 unit 代表单位 默认为米(m) 有如下几个参数
    m 表示单位为米。
    km 表示单位为千米。
    mi 表示单位为英里。
    ft 表示单位为英尺
    
返回值:计算出的距离会以双精度浮点数的形式被返回 如果给定的位置元素(任何一个)不存在, 那么命令返回空值

注意:该命令在计算距离时会假设地球为完美的球形 在极限情况下 这一假设最大会造成 0.5% 的误差  

命令使用

获取两个元素之间的距离 以米为单位
# geodist myplace me you m

错误使用 获取一个不存在的元素
# geodist myplace me not m

redis日常使用之geo

PHP中使用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

// 获取正确的数据
$successRes = $redis->geoDist(
    'myplace', // 键值
    'me', // 元素
    'you', // 元素
    'm' // 距离单位
);

// 获取错误的数据
$faildRes = $redis->geoDist(
    'myplace', // 键值
    'me', // 元素
    'not' // 不存在的元素
);

var_dump($successRes);
var_dump($faildRes);

redis日常使用之geo

GEORADIUS 获取所有不超过指定经纬度特定距离的所有元素

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

命令详解:
- 获取指定经纬度内一个半径的元素信息 radius半径
1.必须指定经纬度 经度在前 纬度在后
2.可以指定范围 范围单位如下
    m 表示单位为米  
    km 表示单位为千米 
    mi 表示单位为英里
    ft 表示单位为英尺
3.获取与给定经纬度之间的距离 需要参数 WITHDIST 单位与给定的距离单位相同
4.获取返回元素的经纬度 需要参数 WITHCOORD
5.可以使用距离进行排序 ASC 从近到远 DESC 从远到近
6.返回的数量
 
返回值:返回一个数组  

命令使用

获取一个元素中距离给定坐标特定距离的所有元素 显示距离 显示坐标 按照从近到远 显示3条
# georadius myplace 116.578486 39.927244 200 km WITHCOORD WITHDIST ASC COUNT 3    

redis日常使用之geo

PHP中使用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

$options[] = 'WITHDIST'; // 距离
$options[] = 'WITHCOORD'; // 经纬度
$options[] = 'ASC'; // 排序 ASC|DESC
$options['COUNT'] = 3; // 条数

// 获取正确的数据
$successRes = $redis->geoRadius(
    'myplace', // 键值
    '116.578486', // 经度
    '39.927244', // 纬度
    '200', // 距离
    'km', // 距离单位
    $options // 其他可选参数
);

var_dump($successRes);

redis日常使用之geo

GEORADIUSBYMEMBER 获取所有不超过指定元素特定距离的所有元素

命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

命令详解
- 根据键值中的一个元素获取指定距离内的元素 相当与GEORADIUS命令的另一版本
1.需要指定元素 而不是经纬度

注意:元素必须是键值中已经存在的元素 返回值也会包含选定的元素

返回值:数组

命令使用

获取一个元素指定范围内的元素 选定元素 me 距离 200 单位 m 返回距离 经纬度 从近到远 3条
# georadiusbymember myplace me 200 m WITHCOORD WITHDIST ASC COUNT 3  

redis日常使用之geo

PHP中使用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

$options[] = 'WITHDIST'; // 距离
$options[] = 'WITHCOORD'; // 经纬度
$options[] = 'ASC'; // 排序 ASC|DESC
$options['COUNT'] = 3; // 条数

// 获取正确的数据
$successRes = $redis->geoRadiusByMember(
    'myplace', // 键值
    'me', // 元素
    '200', // 距离
    'km', // 距离单位
    $options // 其他可选参数
);

var_dump($successRes);

redis日常使用之geo

GEOHASH 获取一个元素的geo hash值

命令:GEOHASH key member [member …]

命令详解
- 获取geo的hash值
1.可以同时获取多个元素的hash值

注意:返回的数据需要自己对应

返回值:一个数组 数组的每个项都是一个 geohash 

命令使用

获取geohash
# geohash myplace me you other

redis日常使用之geo

PHP使用

// 实例化redis对象
$redis = new \Redis();

// 链接redis 本机host地址 默认端口号
$redis->connect('127.0.0.1', 6379);

// 获取正确的数据
$successRes = $redis->geoHash(
    'myplace', // 键值
    'me', // 元素
    'you', // 元素
    'other' // 元素
);

var_dump($successRes);

redis日常使用之geo

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这