写点什么

Redis 实现附近的人,linux 在线学习

作者:MySQL神话
  • 2021 年 11 月 27 日
  • 本文字数:2007 字

    阅读完需:约 7 分钟

"1"

添加多个位置信息

127.0.0.1:0>GEOADD diner:location 121.4465774 31.20485103 'lisi' 121.44534 31.2031 'wangwu' 121.4510648 31.2090667 'zhangliu'


"3"


底层使用的 sortedSet 存储。


GEODIST




计算距离。


key member1 member2 [unit]


, 其中 unit 为单位 m|km|ft(英尺)|mi(英里)

计算两点间的距离,返回距离的单位是米(m)

127.0.0.1:0>GEODIST diner:location zhangsan lisi m


"82.4241"

计算两点间的距离,返回距离的单位是千米(km)

127.0.0.1:0>GEODIST diner:location zhangsan lisi km


"0.0824"


GEOHASH




key member [member …]


返回一个或多个位置元素的 Geohash。保存到 Redis 中是用 Geohash 位置 52 点整数编码。


GeoHash 将二维经纬度转换成字符串。比如下图展示了北京 9 个区域的 GeoHash 字符串,分别是 WX4ER,WX4G2、WX4G3 等,每一个字符串代表了某一矩形区域。


即这个矩形区域内所有的点(经纬度坐标)都共享相同的 GeoHash 字符串,这样既可保护隐私(只表示大概区域位置而非具体点),又容易做缓存。


比如左上角区域内的用户不断发送位置信息请求餐馆数据,由于这些用户的 GeoHash 字符串都是 WX4ER,所以可把 WX4ER 当作 key,把该区域的餐馆信息当作 value 来进行缓存,而若不使用 GeoHash,由于区域内的用户传来的经纬度各不相同的,很难做缓存。字符串越长,表示的范围越精确。



GEOPOS




从 key 里返回所有给定位置元素的位置(经度和纬度)。


key member [member …]

返回 zhangsan 和 lisi 的位置信息

127.0.0.1:0>GEOPOS diner:location zhangsan lisi


  1. "121.44661813974380493"

  2. "31.20559220971455971"

  3. "121.44657522439956665"

  4. "31.20485207113603821"


GEORADIUS




key longitude latitude radius m|km|ft|mi


[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]


给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。


范围可以使用以下其中一个单位:


  • m 表示单位为米

  • km 表示单位为千米

  • mi 表示单位为英里

  • ft 表示单位为英尺


在给定以下可选项时, 命令会返回额外的信息:


  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致

  • WITHCOORD: 将位置元素的经度和维度也一并返回

  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。


命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:


  • ASC


根据中心的位置, 按照从近到远的方式返回位置元素。


  • DESC


根据中心的位置, 按照从远到近的方式返回位置元素。


在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

以 121.446617 31.205593(张三位置)为圆心,3000m 为半径,查询返回用户及其位置

127.0.0.1:0>GEORADIUS diner:location 121.446617 31.205593 3000 m WITHCOORD


  1. "wangwu"

  2. "31.20310057881493293"

  3. "lisi"

  4. "31.20485207113603821"

  5. "zhangsan"

  6. "31.20559220971455971"

  7. "zhangliu"

  8. "31.20906731242401833"

以 121.446617 31.205593(张三位置)为圆心,3000m 为半径,查询返回用户及其距离(单位是米)

127.0.0.1:0>GEORADIUS diner:location 121.446617 31.205593 3000 m WITHDIST


  1. "wangwu"

  2. "302.6202"

  3. "lisi"

  4. "82.5066"

  5. "zhangsan"

  6. "0.1396"

  7. "zhangliu"

  8. "573.0651"

以 121.446617 31.205593(张三位置)为圆心,3000m 为半径,查询返回用户及其距离(单位是米) 由近及远

47.110.246.98:15>GEORADIUS diner:location 121.446617 31.205593 3000 m WITHDIST ASC


  1. "zhangsan"

  2. "0.1396"

  3. "lisi"

  4. "82.5066"

  5. "wangwu"

  6. "302.6202"

  7. "zhangliu"

  8. "573.0651"

以 121.446617 31.205593(张三位置)为

《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


圆心,3000m 为半径,查询返回用户及其 GeoHash 值


127.0.0.1:0>GEORADIUS diner:location 121.446617 31.205593 3000 m WITHHASH


  1. "wangwu"

  2. "4054756135204337"

  3. "lisi"

  4. "4054756138536712"

  5. "zhangsan"

  6. "4054756138736536"

  7. "zhangliu"

  8. "4054756186304127"

最后的话

无论是哪家公司,都很重视 Spring 框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!


部分截图:



本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
Redis实现附近的人,linux在线学习