繁体   English   中英

多个客户端使用Redis缓存

[英]Multiple clients using redis cache

我有一个关于分布式体系结构中的Redis的问题。

假设我有n个客户端,要么是Windows桌面应用程序,要么是asp.net Web / Web API服务器。

客户端之一(假设客户端A)命中高速缓存以获取数据并丢失(数据不在高速缓存中)。 然后,客户端开始获取真实数据(例如从数据库中获取),然后在完成后将其设置在缓存中。

客户端B出现并想要相同的数据,对缓存进行访存,并且由于未命中,因此进行了相同的处理。

客户端B是否有办法...(N)直到数据在高速缓存中之后才进行处理(即转到数据库),而是在可用时从高速缓存中获取数据?

我知道在单个应用程序(或Web服务器)上,使用线程很容易进行检查,但是在分布式体系结构中呢?

这也是一种正确的思维方式吗? 等待过程是否是这样?如果是,那么客户A可以在某处放置一个标记,表明他正在加载数据X,而所有其他客户都应该等待,直到完成为止?

否则,该想法将类似于以下内容:

客户端A请求数据X
缓存中未命中
处理数据X
查看Data X现在是否在缓存中
如果不是,则将数据X添加到缓存中,否则,请使用它并且不要将其存储在缓存中

谢谢!

正如Kevin所说,这被称为缓存踩踏。 解决此问题的最佳文档之一是使用memcached:如何轻松扩展您的网站 (来自Josef Finsel):

在这种情况下,我们需要以某种方式告诉程序另一个程序正在获取数据。 处理此问题的最佳方法是使用另一个内存缓存条目作为锁。

当我们的程序查询memcached并找不到数据时,它试图做的第一件事就是将值写入特定的键。 在我们使用实际的SQL请求作为键名的示例中,我们可以在SQL后面附加“:lock”以创建新的键。

接下来的操作取决于客户端是否支持通过memcached存储命令返回成功消息。 如果是这样,那么我们尝试添加该值。 如果我们是第一个尝试此操作的人,那么我们将返回一条成功消息。 如果该值存在,那么我们将获得失败指示,并且我们知道另一个进程正在尝试更新数据,并且我们等待了预定的时间,然后才尝试再次获取数据。

完成更新缓存的过程后,它将删除锁定键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM