【问题标题】:Multiple clients using redis cache使用redis缓存的多个客户端
【发布时间】: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 中处理这个问题。

标签: c# asp.net caching redis


【解决方案1】:

正如凯文所说,它被称为缓存踩踏。 我读过的与此问题相关的最佳文档之一是使用 memcached:如何轻松扩展您的网站(来自 Josef Finsel):

在这种情况下,我们需要某种方式告诉我们的程序 另一个程序正在获取数据。最好的方法 通过使用另一个 memcached 条目作为锁来处理。

当我们的程序查询memcached找不到数据时,第一个 它试图做的事情是将值写入特定键。在我们的 我们对键使用实际 SQL 请求的示例 我们可以在 SQL 后面加上 ":lock" 来创建我们的新密钥。

我们接下来做什么取决于客户端是否支持返回 memcached 存储命令上的成功消息。如果是这样, 然后我们尝试添加该值。如果我们是第一个尝试 然后我们将收到一条成功消息。如果该值存在,则 我们得到一个失败指示,我们知道另一个进程正在尝试 更新数据,我们等待一些预定的时间 在我们再次尝试获取数据之前。

当正在更新的进程 缓存完成,它会删除锁定键。

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多