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

问题描述 投票:1回答:1

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

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

考虑下图摘自hereExample caching a book我使用这个数字是因为我认为它可以帮助我说明问题。该图考虑了一般的两种情况:书在高速缓存中,或者这不在其中。但是,当从数据库和其他“ getsame-book”中检索一本书时,该图未考虑过渡情况。请求到达。在这种情况下,我想暂时将重复的请求排入队列,直到检索到这本书为止。接下来,一旦书籍到达,将对排队的请求进行答复,结果将保留在缓存中,以便快速检索将来的请求。

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

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

go caching concurrency redis
1个回答
0
投票

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

使用唯一键

为每个book使用unique键,并且如果更改了该书,则该键也应更改。这种设计使您的步骤(6)在Redis中将书保存为幂等操作(您可以多次执行,但结果相同)。因此,使用“ get-same-book”可以避免任何比赛情况。

幂等请求或异步消息

我想暂时将重复的请求排队,直到检索到这本书为止。接下来,一旦书籍到达,就将结果与已排队的请求一起回复

我不建议您描述<。如果请求是高速缓存未命中,请让它从数据库中检索它-但将其设计为[[幂等。另外,您应该将所有请求处理为异步,并使用消息队列,例如nats,RabbitMQ之类的东西,但是随着解决方案的增加,复杂性也随之增加。

© www.soinside.com 2019 - 2024. All rights reserved.