【问题标题】:Does Redis provide Expiration and an Expiration callback?Redis 是否提供 Expiration 和 Expiration 回调?
【发布时间】:2012-12-04 12:16:36
【问题描述】:

我正在开始一个绿地项目。在其中,我们希望有一个有期限的 QUEUE。所以我添加了一个密钥,该项目在 .. 说 .. 20 分钟后过期。

预计队列会很大。具有不同到期时间的数千个密钥。

我马上想到可能使用ServiceStack.Redis,当然还有Redis :)

到目前为止,这有望在AppHarbor + RavenDb + RedisToGo 上托管。 Redis Key 将是 RavenDb Id。 (字符串 - 例如users/1 或其他)

问题

  1. 我可以利用 SS.Redis 将项目添加到具有过期时间的 Redis 队列吗? (我假设是的。例如 typedClient.ExpiresAt(..))
  2. 我可以利用 RedisToGo 作为云托管的 redis 提供商并使用 SS.Redis 作为客户端吗? (再次假设是和是)
  3. 当一个项目过期时,我可以让它做一个 REST GET 或 POST 到某个 URL 吗? - 所以我可以“处理”到期? (不知道)。

【问题讨论】:

    标签: .net redis queue servicestack redistogo


    【解决方案1】:
    1. 在 redis 中,过期的是 key,而不是 list/set/hash/etc 中的单个项目。如果您有一个队列(我假设它是 redis 术语中的 list,在不同的端推送/弹出),那么您的到期适用于同一队列中的 all 项.对于允许每个项目到期的列表(等),没有一个很好的比喻。坦率地说,最简单的事情可能是在有效负载中包含逻辑到期,如果它们过期,则在弹出它们时丢弃它们

    2. 由于客户端可以通过所选端口访问服务器,因此您应该没问题 - 无论特定的客户端和服务器/提供商如何;但如果你有这些服务,验证这一点可能很简单。

    3. Redis 目前不包含任何到期触发功能,这已被提议并(似乎)被 2.8 版本接受 (see discussion here); redis 不会自己向 url 发布任何帖子,但假设您可以只在事件频道上收听并在 您的代码中执行此操作

    但是,这又回到了密钥与项目的到期问题。

    【讨论】:

    • KEYS 都过期了。该项目可以是此 convo 主题的任何内容。只是 Key .. 有一些价值 .. 他们 Key 将在 20 分钟或 5 小时或任何时间到期。这给我们留下了 => 触发器功能。所以这意味着不(截至本文发布时)。 Drats..但是哦,好吧。 ...呃...有什么其他建议吗?
    • @Pure.Krome 如果您只是使用键,我不太确定您如何将其用作队列,除非您有一个仅包含出列键的列表,然后进行第二次提取(顺便说一句,在 2.6 中可以通过 lua 很好地编写脚本 - 即弹出,然后尝试“获取” - 如果它返回 nil(过期),然后弹出下一个等)
    • @Pure.Krome 至于主动通知:同样,目前没有,但您可以在 redis 组上发帖请求更新/eta
    【解决方案2】:

    尝试为您的队列使用排序集 (ZSET) - 以时间戳作为 SCORE。当您使用 ZREVRANGEBYSCORE 从队列中挑选作业时,您可以检查作业提交到队列中的时间戳,如果它太旧,您可以简单地忽略该作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 2017-11-21
      • 2022-01-22
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多