redis - 如何对 redis 哈希执行地理空间操作
问题描述
我正在阅读 redis 地理空间的文档,我发现我只能存储一个key
, latitude
,longitude
和name
.
我存储了一些哈希值,例如events:id
,listings:id
等。事件例如保存事件对象的 JSON。这是因为这些项目变化不大,我将它们缓存在 redis 中。
为了events
在某个半径范围内找到一些,我该怎么做?
我必须做这样的事情吗?
GEOADD [event:id] {event.latitude} {event.longitude} {event.id}
然后将这些映射到events:id
哈希?
解决方案
GEOADD key longitude latitude member
将一个条目 ( member
withlongitude
和latitude
) 添加到已排序的集合key
中,即地理空间索引。如果排序不存在,则创建排序。
为了能够查询某个半径内的事件,您希望将所有事件都放在同一个地理空间排序集中。
这意味着您可以使用以下命令将所有内容添加到同一密钥:
GEOADD events:location {event.longitude} {event.latitude} {event.id}
您一次可以添加多个事件:
GEOADD events:location 13.361389 38.115556 "event:1" 15.087269 37.502669 "event:2"
注意经度在前
然后,您可以使用用户定义的位置附近的所有事件GEORADIUS
> GEORADIUS events:location 15 37 200 km WITHDIST
1) 1) "event:1"
2) "190.4424"
2) 1) "event:2"
2) "56.4413"
其他可用的命令是:
GEODIST
- 两个成员之间的距离GEOHASH
-代表位置的Geohash字符串GEOPOS
- 所有指定成员的位置(经度、纬度)GEORADIUSBYMEMBER
- 因为GEORADIUS
它采用地理空间索引中已经存在的成员的名称
您还可以在地理空间索引上使用 sorted set 命令。例如,要获取地理空间索引上有多少事件:
> ZCARD events:location
(integer) 2
您可以将整个 JSON 编码的事件作为地理空间索引的成员,或者只是event:id
将事件数据作为另一个键的键,即您的调用。
推荐阅读
- ruby-on-rails - 从 6.1.3.1 升级到 6.1.4.1 后 Rails 应用程序无法运行
- node.js - 我需要一种最有效的 Node.js API 版本控制方法
- python - 读取并上传到 GitHub 非 UTF-8 文件 Python
- ios - 为什么不让用户参与此 Firebase A/B 测试?
- c# - 使用 WPF C# 显示大型文本文件
- java - 无法清除休眠查询缓存
- java - 当我单击时如何使按钮的颜色发生变化,当我再次单击时颜色返回到第一种颜色
- oracle - 如何禁用 weblogic WST?
- c++ - 对父类成员的未定义引用
- python - 类型错误:__init__() 缺少 1 个必需的位置参数:“超时”