gpt4 book ai didi

laravel - 从 Laravel Redis 队列中删除重复的作业

转载 作者:行者123 更新时间:2023-12-03 06:38:43 26 4
gpt4 key购买 nike

我有一个可调度的工作来清除和重建特定模型的缓存。
缓存重建大约需要 10 秒。
有时,该作业可以按顺序多次触发,并且我经常会遇到多个排队的作业,所有作业都为同一模型执行相同的缓存清除和重建。
我正在寻找一种在调度当前作业之前删除该特定模型的任何相同作业(缓存重建)的方法。

最佳答案

没有简单或 %100 的工作方式来删除重复的工作。 Laravel 的 Redis 队列驱动程序使用排序集和列表来处理延迟/非延迟作业。这个answer可能会提供一些关于它的细节。当您将作业推送到队列中时,您无法在处理之前将其删除。 (您可以尝试,但很难,链接有答案)。
您可以做的是创建一个控制机制来防止触发缓存失效作业。假设在你推送你的工作之前,你设置了一个唯一的标识符。你可以使用 Redis 的 SET带有 EX 的命令和 NX选项。

  • 设置键来保存字符串值。如果 key 已经包含一个值,则无论其类型如何,都会将其覆盖。
  • NX——仅在 key 不存在时才设置 key 。
  • EX seconds -- 设置指定的过期时间,以秒为单位。

  • 在你推送你的工作之前,你执行第一个命令是这样的;
    127.0.0.1:6379> set mymodel:id:1 some-random-string-test EX 15 NX
    OK
    127.0.0.1:6379> ttl mymodel:id:1
    (integer) 10
    127.0.0.1:6379> get mymodel:id:1
    "some-random-string-test"
    127.0.0.1:6379> set mymodel:id:1 some-random-string-test-another EX 15 NX
    (nil)
    127.0.0.1:6379>
    你正在做的是,你得到 id您的模型并创建一个 key 。您将 key 设置为 expire 和 set if not exists选项。如果响应是 OK那么您将在给定的时间间隔内(在我的示例中为 15 秒)首次设置此键。如果你得到 nil响应这意味着,给定 id 的作业仍然是 locked .所以你不会发送它。它将为每个模型提供 15 秒的时间窗口,以阻止您调度它。
    --
    如果您不能(不想)阻止触发作业,那么您可以以不同的方式使用相同的命令。每当您要发送作业时,您都会创建一个唯一标识符并执行 set mymodel:id:1 some-random-string-test EX 15 NX在发送之前。但是这一次您也将向作业的构造函数发送标识符。在您的 handle 开头方法,你将使用redis的 GET获取 mymodel:id:1 值的方法并将其与您发送给作业构造函数的标识符进行比较。 15 秒内只有 1 个匹配的标识符,这意味着只有一个作业将被“完全”处理。为相同作业创建的其他标识符不会更新该 redis 键(NX 选项)的值,因此其他作业的标识符将与 mymodel:id:1 的值不匹配.这意味着它们将被取消或未完全处理,因为它们不会通过条件。

    关于laravel - 从 Laravel Redis 队列中删除重复的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63122386/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com