gpt4 book ai didi

go - 结果到达时如何管理缓存服务器上的重复请求

转载 作者:行者123 更新时间:2023-12-02 10:44:33 26 4
gpt4 key购买 nike

在使用 go 语言编写的请求很高的 Web 服务的上下文中,我正在考虑缓存一些计算。为此,我正在考虑使用 Redis。

我的应用程序很容易收到包含相同有效负载的大量请求,从而触发昂贵的计算。因此,缓存将奖励并允许计算一次。

考虑下图,摘自 here Example caching a book我使用这个图是因为我认为它可以帮助我说明问题。该图考虑了一般两种情况:这本书在缓存中,或者这本书不在缓存中。但是,该图没有考虑从数据库检索一本书和其他“获取同一本书”时的短暂情况请求到达。在这种情况下,我想暂时将重复的请求排队,直到检索到这本书。接下来,一旦书籍到达,排队的请求就会得到回复,结果将保留在缓存中,以便快速检索 future 的请求。

所以我的问题询问实现此要求的方法。我正在考虑在服务器(存储库)上使用一种表来写入查询数据库的状态(计算,就绪),但这似乎有点复杂,因为我需要处理一些竞争条件。

所以我想知道是否有人知道这个模式,或者Redis本身是否以某种方式实现它(我在咨询中没有找到它,但我怀疑使用Redis锁是可能的)

最佳答案

您可以按照您的描述进行设计。但有一些事情很重要。

使用唯一 key

为每本书使用一个唯一 key ,如果该书发生更改,该 key 也应该更改。这种设计使您在 Redis 中保存书籍的步骤 (6) 成为一种幂等操作(您可以执行多次,但结果相同)。因此,您可以使用“get-same-book”避免任何竞争条件。

幂等请求或异步消息

I would like to queue the repeated requests temporarily until the book is retrieved. Next, once the book has already arrived, the queued requests are replied with the result

我不建议按照您的描述对请求进行排队。如果请求是缓存未命中,则让它从数据库中检索它 - 但将其设计为幂等的。或者,您应该以异步方式处理所有请求,并使用消息队列,例如nats 、RabbitMQ 等,但复杂性随着该解决方案的增加而增加。

序列化请求

My problem is that while that second of computation where the result is not still gotten, too many repeated requests can arrive and due to the cost I need to avoid to repeat their computations. I need to find a way of retaining them while the result of the first request arrives.

听起来您希望将计算序列化,而不是同时进行,因为您希望避免两次执行相同的计算。为了解决这个问题,您应该让请求初始化计算,例如将输入放入队列,然后按串行顺序进行计算(但如果它们具有不同的 key ,仍然可能同时进行),最后通知客户端,或者如果客户端正在订阅更新(更好的解决方案)。

Redis 确实支持 PubSub但这取决于你对客户有什么要求。为了可扩展性,我会推荐一个没有锁的解决方案。

关于go - 结果到达时如何管理缓存服务器上的重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58651343/

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