我有一个要求,我必须在Redis中进行延迟调度。延迟可以是几个小时。正如本answer中所述,实现此目的的一种方法如下: -
ZRANGEBYSCORE jobs -inf, <current unix timestamp>
有人可以提出一些方法,如何修改上述方法来处理以下情况: -
我不能丢失消息或向主工作线程提供重复的作业。在上述方法中,如果调度程序线程在从有序集读取消息后死亡,则写入主作业列表但在从有序集中删除消息之前。然后该消息将被传递两次到主要工作列表?
我能想到的一种方法是调度程序线程将写入中间列表而不是主列表。另外一个线程将在每N秒内继续检查中间列表。每当有一些工作可用时,通过执行BRPOPLPUSH将其移动到主列表。
有人可以提出其他一些更好,更优化的方法吗?
答案 0 :(得分:1)
我没有尝试过,但我认为您可以使用Lua script将作业从已排序集转移到主作业列表,并将其从已排序集中删除。根据{{3}}上的文档:
根据定义,Redis脚本是事务性的,因此您可以使用Redis事务执行所有操作,也可以使用脚本执行操作,通常脚本将更简单,更快速
和
事务中的所有命令都被序列化并按顺序执行。在执行Redis事务的过程中,永远不会发生由另一个客户端发出的请求。这可以保证命令作为单个隔离操作执行。 要么处理所有命令,要么都不处理,因此Redis事务也是原子的。