Redis GEORADIUS地理位置分页实现

之前做了一个reids geo经纬度附近的人排序功能,今天终于找到了分页的方法与大家一同分享

redis geo实现文章:https://blog.csdn.net/qq_24909089/article/details/96871817

正文:

函数:

GEORADIUS命令中有很多可选参数,这里一一解释一下: 
- withcoord:返回结果中包含经纬度 
- withdist:返回结果中包含离中心节点位置的距离 
- withhash:返回结果中包含geopath 
- COUNT count:指定返回结果的数量 
- asc|desc:返回结果根据离中心节点位置的距离进行升序或降序 
- store key:将返回结果的地理位置信息保存到指定key 
- storedist key:将返回结果离中心节点的距离保存到指定key
————————————————

假设我们现在有用户的经纬度redis列表,如下图,value是用户的ID,score是用户的经纬度坐标,无奈的是georadius 方法不能直接查询分页。只能查count 数量,之前做的比较笨的方法是取出来用数组自己写分页,之前没有发现有storedist函数的妙用。

问题剖析地址:https://github.com/antirez/redis/issues/3019

定位关键点:

我们可以看到做法就是 使用store函数把查询的列表写入另一个有序集合中,当然这样每一个用户都会有一个自己的排序列表,不过我发现store函数并不能把georadius 计算出的位置列表按顺序写入新的有序集合。文章里也有说明

继续往下看我发现了另一个函数,storedist()

storedist() 函数的意义就像是georadius 里的withdist,他会按照withdist计算的结果作为有序集合的分数进行新建列表,如下图

 

这样生成一个每一个用户的有序集合我们就可以用普通的有序集合函数进行分页了如:

geo 支持的参数

分页实现原理:把geo经纬度筛选后的结果写入另一个有序集合中,在这个有序集合中进行分页操作。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
RedisGEO命令可以通过地理位置坐标来对存储在Redis中的Key进行排序和查询。其中,georadius命令可以根据给定的经纬度和半径来获取指定范围内的所有地理位置信息。具体使用方法如下: ``` GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] ``` 参数说明: - key:要查询的键名。 - longitude:经度。 - latitude:纬度。 - radius:半径距离。 - m|km|ft|mi:距离单位,分别为:米、千米、英尺和英里。 - WITHCOORD:返回坐标。 - WITHDIST:返回距离。 - WITHHASH:返回Geohash值。 - COUNT count:限制结果数量。 - ASC|DESC:排序方式。 - STORE key:将查询结果存储到另一个键值。 - STOREDIST key:将查询结果存储到另一个键值,并且存储值为距离。 使用示例: ``` 127.0.0.1:6379> GEOADD Cities 116.46 39.92 Beijing 121.48 31.22 Shanghai 113.27 23.13 Guangzhou (integer) 3 127.0.0.1:6379> GEORADIUS Cities 116.46 39.92 1000 km 1) "Beijing" 127.0.0.1:6379> GEORADIUS Cities 113.27 23.13 1000 km 1) "Guangzhou" 127.0.0.1:6379> GEORADIUS Cities 116.46 39.92 1000 km WITHCOORD WITHDIST 1) 1) "Beijing" 2) 1) "116.46" 2) "39.92" 3) "33.117" 3) "0.000" ``` 以上示例中,首先使用GEOADD命令向Cities键中添加三个地理位置信息,然后使用GEORADIUS命令查询距离北京或广州1000公里以内的所有城市信息,并返回相应的坐标和距离。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值