如何在Redis中过期地理位置

5
我正在使用Redis的地理支持功能。
通过以下方式添加新的地理位置:
"GEOADD" "report-geo-set" "30.52439985197" "50.56539003041" "john"

我希望在X个小时后从报告地理集中删除约翰·基。

有什么建议吗?

谢谢, 雷。

1个回答

9
无法使用内置命令实现。请记住,基于zset的地理支持,你的问题看起来像是“如何在ZSET中为单个键使用TTL”。你可以尝试以下方法:
  1. 将“john”添加到具有 time() + X 小时得分的附加特殊超时 ZSET 中。
  2. 定期运行脚本/工作器,从超时 zset 获取所有过时的键,并对你的“john”键执行ZREM。
下面是一个示例建议。 添加项目:
MULTI
GEOADD report-geo-set 30.52439985197 50.56539003041 john
ZADD geo-timeout 1452600528 john //1452600528 is unix time stamp current + X hours 
EXEC

定期清理脚本(使用LUA):
local currentTime = redis.call('TIME');
local list = redis.call('ZRANGEBYSCORE', 'geo-timeout', 0, currentTime[0]);
local keysRemoved = 0;
for i, name in ipairs(list) do
    redis.call('ZREM', 'geo-timeout', name);
    redis.call('ZREM', 'report-geo-set', name);
    keysRemoved = keysRemoved + 1;
end
return keysRemoved;

您还可以每小时旋转一次地理位置有序集合,并查看最后N个集合。 - Not_a_Golfer
或者,为相同的成员保留另一个已排序集合,但使用时间戳作为分数,并定期/在每个请求上使用它手动过期(ZREM)两个集合中的旧成员。 - Itamar Haber
@misterion,请在特殊超时zset中添加john,并设置X小时后的时间分数。您能详细说明一下吗?我不确定是否理解正确。谢谢。 - rayman
@ItamarHaber 地理集合中的分数不是用于Geohash的吗? - Not_a_Golfer
@Not_a_Golfer 是的 - 这就是我建议使用两个集合的原因,一个用于地理位置,另一个用于 TTL。 - Itamar Haber
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接