这是我本周正在研究的问题,我有点在这里碰壁。
假设我有100个可用资源来完成一些快速任务。
我想为客户做的是,尽可能快:
但是因为我的客户端不是很安全,并且有时会在代码运行期间失败,所以我真的想设置一个将资源标记为已占用的到期时间,以便资源永远不会处于占用状态。 / 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确实非常快,但是此代码段的伸缩性却不佳。
答案 0 :(得分:1)
我的头顶上
expired
事件通知上设置keyspace listener 需要资源时,用SRANDMEMBER
随机选择一个,然后将其移动到SMOVE
设置的正在使用的资源中。在同一事务中,使用SETEX
设置一个简单的到期密钥,该密钥具有良好的前缀,资源的名称/类型以及所需的TTL。
设置一个redis密钥空间通知使用者(仍然是新手,但请查看其最新技术Redis Gears以获得其超级简化版本!),该监听器将监听您分配的前缀的expired
事件。当发生这些事件之一时,请运行与上面相同的SMOVE
逻辑,但只需将资源移回空闲资源集中即可。
关于实际资源本身,当它们完成时,让它们自失效其跟踪键,并且通知使用者可以处理状态刷新:)
这应该为您提供所需的灵活性!
这里有类似的问题,有些答案可能有用:How to "EXPIRE" the "HSET" child key in redis?