【问题标题】:Decrement a Redis counter every "x" seconds每“x”秒递减一个 Redis 计数器
【发布时间】:2016-01-14 18:02:30
【问题描述】:
我有一个用例,我需要每“x”秒递减一个 redis。有没有办法在 Redis 中做到这一点? Redis有“aeCreateTimeEvent”,但是它暴露给客户端了吗?
如果我们从 Redis 外部执行此操作,我们需要一种可靠的方法来调用代码以减少存储在 Redis 中的计数器。
可靠,我的意思是:托管“每“x”秒递减“程序的节点失败,不应导致此设置失败。
也就是说,可能有一个分布式程序来减少听起来像是很多工作。所以最好在 Redis 中内置一些东西。
【问题讨论】:
标签:
redis
distributed-computing
【解决方案1】:
不,aeCreateTimeEvent 作为仅在 Redis 内部使用的所有简单事件库(在AE_H 中描述)。但是,通过一些小型 Redis 服务器修补来做到这一点并不难。
我们用这种方式来解决类似的问题:
- 从
redic.s 修补serverCron 函数,以使用带有run_with_period 宏的自定义代码添加新条目。
- 将需要减少的键添加到一些特殊列表中。
- 在您的自定义函数中迭代此键。
我认为这对于 Redis 服务器来说可能是一个非常酷的想法 - 添加将自定义 LUA 脚本添加到 Redis cron 管道的功能。这允许将 Redis 转换为某种 LUA 应用程序服务器。
如果一致性很重要
- 添加
last update 时间与您最后一次减量。
- 每次递减时更新
last update。
- 检查
last update 的值以确定递减步骤:(current_time - last_update) mod X * decrement_step。
这允许您在服务器崩溃时恢复正确的递减值。