Redis实现附近的人

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!


GEOADD key longitude latitude member [longitude latitude member …] 添加位置信息

添加单个位置

127.0.0.1:0>GEOADD diner:location 121.446617 31.205593 ‘zhangsan’

“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”
  1. “31.20559220971455971”

    1. “121.44657522439956665”
  2. “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”
  1.  1)    "121.44534140825271606"
    
  2. “31.20310057881493293”

    1. “lisi”
  3.  1)    "121.44657522439956665"
    
  4. “31.20485207113603821”

    1. “zhangsan”
  5.  1)    "121.44661813974380493"
    
  6. “31.20559220971455971”

    1. “zhangliu”
  7.  1)    "121.45106524229049683"
    
  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”
  1. “302.6202”

    1. “lisi”
  2. “82.5066”

    1. “zhangsan”
  3. “0.1396”

    1. “zhangliu”
  4. “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”
  1. “0.1396”

    1. “lisi”
  2. “82.5066”

    1. “wangwu”
  3. “302.6202”

    1. “zhangliu”
  4. “573.0651”

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

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

    1. “wangwu”

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱

  • Java互联网工程师面试1000题

image.png

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

image.png

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

image.png

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

image.png

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
像设计模式,建议可以看看下面这4份PDF(已经整理)

[外链图片转存中…(img-JsdIWMT1-1714649780999)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-jfeLcR6I-1714649780999)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值