【发布时间】:2016-12-17 04:10:43
【问题描述】:
我有一个关于分布式架构中的 redis 的问题。
假设我有 n 个客户端,要么是 windows 桌面应用程序,要么是 asp.net web/web api 服务器。
其中一个客户端,比如说客户端 A,在缓存中找到数据并且未命中(数据不在缓存中)。然后客户端开始获取真实数据(比如说来自数据库),然后在完成后将其设置在缓存中。
客户端 B 出现并想要相同的数据,对缓存进行提取,由于未命中,因此进行相同的处理。
有没有办法让客户端 B ...(N) 在数据在缓存中之前不进行处理(即转到数据库)并在缓存可用时从缓存中获取数据?
我知道在单个应用程序(或 Web 服务器)上,使用线程很容易检查,但在分布式架构中?
这也是一种正确的思维方式吗?对于等待过程 如果是这样,那么客户端 A 是否可以在某处放置一个标志,说明他正在加载数据 X,并且所有其他客户端都应该等到他完成?
否则,这个想法将类似于:
客户端 A 请求数据 X
缓存中未命中
处理数据 X
查看数据 X 现在是否在缓存中
如果没有,则将 Data X 添加到缓存中,否则,使用它并且不要将其存储在缓存中
谢谢!
【问题讨论】:
-
您所描述的是cache stampede。如果您查看该文章的缓解部分,您会看到基本思想,如果您环顾四周,您会发现一些库试图在 Redis 中处理这个问题。