【问题标题】:How to expire gelocations on redis如何使redis上的地理位置过期
【发布时间】:2016-04-16 21:38:42
【问题描述】:

我在 Redis 上使用地理支持。

以这种方式添加新的地理位置:

"GEOADD" "report-geo-set" "30.52439985197" "50.56539003041" "john"

我想在 X 小时后使报告地理集中的 john 密钥过期。

有什么建议吗?

谢谢, 射线。

【问题讨论】:

    标签: java redis geolocation maps


    【解决方案1】:

    无法使用内置命令。请记住,基于 zset 的地理支持,您的问题类似于“如何在 ZSET 中为单个键使用 TTL”。

    你可以使用类似的东西:

    1. 将“john”添加到额外的特殊超时 ZSET 与 time() + X 小时分数。
    2. 不时运行脚本/worker,从超时 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;
    

    【讨论】:

    • 您也可以每隔一小时左右旋转一次地理 zset,然后查看最后 N 个集合。
    • 或者,为相同的成员保留另一个排序集,但使用时间戳作为分数,并定期/在每个请求中使用它来手动过期(ZREM)两个集合中的旧成员。
    • @misterion,添加 john 特殊超时 zset 时间 + X 小时分数。你能详细说明一下吗?不知道我明白了。谢谢。
    • @ItamarHaber 不是用于 geohash 的地理集中的分数吗?
    • @Not_a_Golfer 是的 - 这就是为什么我建议使用两套,一套用于地理,另一套用于 ttl
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2021-10-18
    • 2017-10-22
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多