我在分布式架构中有关于redis的问题。
假设我有n个客户端,Windows桌面应用程序或asp.net web / web api服务器。
其中一个客户端,比如客户端A,点击缓存中的数据并且有未命中(数据不在缓存中)。然后客户端开始获取真实数据(从数据库开始),然后在完成后将其设置在缓存中。
客户端B出现并希望获得相同的数据,获取缓存并因为它是未命中的,所以进行相同的处理。
客户端B是否有办法......(N)不进行处理(即转到数据库),直到数据进入缓存并从缓存中获取数据而不是从缓存中获取数据可用?
我理解在一个应用程序(或Web服务器)上,使用线程很容易检查,但是在分布式架构中?
这也是一种正确的思考方式吗?对于等待过程 如果是这样,那么客户A可以在某个地方放置一个标志,表明他正在加载数据X并且所有其他客户应该等到他完成了吗?
否则,这个想法就会出现:
客户A请求数据X
缓存中的小姐
处理数据X
查看数据X现在是否在缓存中
如果没有,请将数据X添加到缓存中,否则,使用它并且不将其存储在缓存中
谢谢!
答案 0 :(得分:2)
凯文说,它被称为缓存踩踏事件。 我读过这个问题的最佳文档之一是使用memcached:如何轻松扩展您的网站(来自Josef Finsel):
在这个例子中我们需要的是告诉我们程序的一些方法 另一个程序正在处理获取数据。最好的方法 通过使用另一个memcached条目作为锁来处理。
当我们的程序查询memcached并且无法找到数据时,第一个 它试图做的是将值写入特定键。在我们的 我们使用密钥的实际SQL请求的示例 我们可以追加的名字":lock"到SQL创建我们的新密钥。
我们接下来做什么取决于客户端是否支持返回 memcached存储命令的成功消息。如果是的话, 然后我们尝试添加该值。如果我们是第一个尝试的人 这样我们就会收到成功的消息。如果该值存在则 我们得到失败指示,我们知道另一个进程正在尝试 更新数据,我们等待一段预定的时间 在我们再次尝试获取数据之前。
当进程正在更新时 缓存完成后,它会删除锁定密钥。