Redis模式:如何在到期时缓存可用的/占用的资源?

时间:2019-07-17 11:11:19

标签: python redis redis-py

这是我本周正在研究的问题,我有点在这里碰壁。

假设我有100个可用资源来完成一些快速任务。

我想为客户做的是,尽可能快:

  1. 获取第一个可用资源
  2. 将其标记为已占用
  3. 使用它
  4. 将其标记为免费。 对于这种事情,我认为最好使用排序集。

但是因为我的客户端不是很安全,并且有时会在代码运行期间失败,所以我真的想设置一个将资源标记为已占用的到期时间,以便资源永远不会处于占用状态。 / p>

这听起来像是一个非常普遍的问题,我敢肯定有很多关于如何使用Redis修复它的文献,但我找不到。

我发现了“维护全球排行榜”这类问题的许多模式和示例,但是这些示例都没有涉及密钥到期。

我目前有这样的解决方案:

for ressource in ressources:
    if GET <ressource> == 0:
        SET <ressource> 1, EX=10
        use_ressource(<ressource>)
        SET <ressource> 0, EX=10
    else:
        continue

事实是,一旦我使用了很多资源,就可能需要大量操作才能找到第一个可用资源,尽管Redis确实非常快,但是此代码段的伸缩性却不佳。

1 个答案:

答案 0 :(得分:1)

我的头顶上

  • 维护一组免费资源
  • 维护一组已用资源
  • expired事件通知上设置keyspace listener

需要资源时,用SRANDMEMBER随机选择一个,然后将其移动到SMOVE设置的正在使用的资源中。在同一事务中,使用SETEX设置一个简单的到期密钥,该密钥具有良好的前缀,资源的名称/类型以及所需的TTL。

设置一个redis密钥空间通知使用者(仍然是新手,但请查看其最新技术Redis Gears以获得其超级简化版本!),该监听器将监听您分配的前缀的expired事件。当发生这些事件之一时,请运行与上面相同的SMOVE逻辑,但只需将资源移回空闲资源集中即可。

关于实际资源本身,当它们完成时,让它们自失效其跟踪键,并且通知使用者可以处理状态刷新:)

这应该为您提供所需的灵活性!


这里有类似的问题,有些答案可能有用:How to "EXPIRE" the "HSET" child key in redis?