redis 西芹:如何避免把同一个任务放在队列上不止一次?

4nkexdtk  于 2023-11-16  发布在  Redis
关注(0)|答案(1)|浏览(151)

我写了一个非常简单的FastAPI/Celery/Redis/Flower程序来开始理解它们的工作。
FastAPI路由将在Redis缓存中查找字符串,如果找到,则返回hash/dict和code=200。
如果没有,它将把该字符串传递给Celery,这将触发一个长时间的计算(不是在这个虚拟的仓库中,而是在真实的生活中,它可能需要长达10秒),并返回一个code=202。当处理完成时,结果将被添加到Redis缓存中。
我想避免的是,当字符串排队等待处理时,如果我收到一个对同一字符串的请求(处理可能需要很多秒),我只想返回一个code=202,而没有一个新任务排队等待同一字符串。
感谢任何澄清。

bvuwiixz

bvuwiixz1#

我在这里回答而不是使用评论,因为答案很长。

前提

我从来没有使用过redis,所以对我说的话持保留态度。我使用术语table,因为我从SQL背景到达,所以它可能是不正确的。
想法1
这里的基本思想是将数据分为两部分:cachepreparation/pre-cache。该高速缓存只是包含数据的高速缓存,而pre-cache是一种用于存放正在准备的数据值的空间。一旦准备好,它们将从pre-cache移动到实际的cache。未命中该高速缓存将触发命中pre-cache。在这种情况下,您可能会向用户返回一些信息,说明数据尚未就绪呢
第二个想法
这个想法将Idea 1的两个表合并为一个表。您收到一个请求,该请求在cache中有一个有效的条目,其值为非空值,返回该值。如果有一个cache未命中,则意味着必须计算数据。计算该数据,但首先在cache中创建一个条目。这样,如果第二个同样的数据请求到达,程序将发现一个空值,识别出计算已经开始但还没有结束。2然后你的程序将按照你对这种边缘情况的决定来运行。

相关问题