我写了一个非常简单的FastAPI/Celery/Redis/Flower程序来开始理解它们的工作。
FastAPI路由将在Redis缓存中查找字符串,如果找到,则返回hash/dict和code=200。
如果没有,它将把该字符串传递给Celery,这将触发一个长时间的计算(不是在这个虚拟的仓库中,而是在真实的生活中,它可能需要长达10秒),并返回一个code=202。当处理完成时,结果将被添加到Redis缓存中。
我想避免的是,当字符串排队等待处理时,如果我收到一个对同一字符串的请求(处理可能需要很多秒),我只想返回一个code=202,而没有一个新任务排队等待同一字符串。
感谢任何澄清。
1条答案
按热度按时间bvuwiixz1#
我在这里回答而不是使用评论,因为答案很长。
前提
我从来没有使用过redis,所以对我说的话持保留态度。我使用术语
table
,因为我从SQL
背景到达,所以它可能是不正确的。想法1
这里的基本思想是将数据分为两部分:
cache
和preparation/pre-cache
。该高速缓存只是包含数据的高速缓存,而pre-cache
是一种用于存放正在准备的数据值的空间。一旦准备好,它们将从pre-cache
移动到实际的cache
。未命中该高速缓存将触发命中pre-cache
。在这种情况下,您可能会向用户返回一些信息,说明数据尚未就绪呢第二个想法
这个想法将
Idea 1
的两个表合并为一个表。您收到一个请求,该请求在cache
中有一个有效的条目,其值为非空值,返回该值。如果有一个cache
未命中,则意味着必须计算数据。计算该数据,但首先在cache
中创建一个条目。这样,如果第二个同样的数据请求到达,程序将发现一个空值,识别出计算已经开始但还没有结束。2然后你的程序将按照你对这种边缘情况的决定来运行。