Redis GEORADIUS地理位置分页实现

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

redis geo实现文章:https://blog.****.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函数的妙用。

Redis GEORADIUS地理位置分页实现

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

定位关键点:

Redis GEORADIUS地理位置分页实现

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

Redis GEORADIUS地理位置分页实现

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

Redis GEORADIUS地理位置分页实现

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

Redis GEORADIUS地理位置分页实现Redis GEORADIUS地理位置分页实现

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

Redis GEORADIUS地理位置分页实现