【问题标题】:Expire geospatial items in Redis过期 Redis 中的地理空间项目
【发布时间】:2017-10-22 00:13:37
【问题描述】:

Redis 中有关于有序集合项过期的建议(请参阅 https://groups.google.com/d/msg/redis-db/rXXMCLNkNSs/Bcbd5Ae12qQJhttps://quickleft.com/blog/how-to-create-and-expire-list-items-in-redis/),我尝试了使用 ZREMRANGEBYSCORE 和 ZREMRANGEBYRANK 命令使地理空间索引失效的工作方法(未删除任何内容)。

我成功使用了 ZREMRANGEBYLEX。

除了字符串之外,还有其他方法可以处理地理空间项目分数吗?

更新

例如,如果一个项目的生存时间(ttl)是 30 秒,我将其添加为:

geoadd 1 -8.616021 41.154503 30

现在,假设工人在 40 秒后执行,我期待

zremrangebyscore 1 0 40

会做这项工作,但它不会,

ZREMRANGEBYLEX 1 [0 [40

做到了。为什么会出现这种行为?那就是说地理空间项的分数只支持字典操作?

【问题讨论】:

  • Geosets 是排序集,因此您可以使用任何ZREM* 命令删除元素。分数是坐标,使用 geohash 编码,因此虽然可以按分数和/或排名删除,但它没有多大意义。你想做什么?
  • 嗨,我想删除所有过期的项目。为此,我使用成员(分数)作为生存时间(ttl)值。请参阅更新的问题。谢谢。

标签: redis geospatial


【解决方案1】:

Sorted Sets 有元素(字符串),每个元素都有一个分数(浮点数)。 Geosets 使用分数来编码坐标。

Redis 不会使 Sorted Set(或 Geoset)中的成员过期。如果需要,您必须自己删除它们。

在您的情况下,您需要保留两个排序集 - 一个作为您的 GeoSet,另一个用于管理 TTL 作为分数。

例如,假设您的成员名为“foo”,添加它:

ZADD ttls 30 foo
ZADD elems -8.616021 41.154503 foo

要手动过期,首先找到调用ZRANGEBYSCORE ttls 的成员,然后将它们从两个集中删除。

提示:最好使用时间戳而不是秒数。

【讨论】:

  • 什么会更有效率?例如,通过每 5 秒触发一次清理过程来删除过时的项目(5 秒是坐标的有效时间),或者在每次调用 elems 时在管道中执行清理过程(我每秒有 1000 次调用 elems)?
  • 我会测试它...但直觉上我会选择定期清洁器,尽管保持它的额外复杂性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多