Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用redis缓存的多个客户端_C#_Asp.net_Caching_Redis - Fatal编程技术网

C# 使用redis缓存的多个客户端

C# 使用redis缓存的多个客户端,c#,asp.net,caching,redis,C#,Asp.net,Caching,Redis,我有一个关于分布式体系结构中的redis的问题 假设我有n个客户端,windows桌面应用程序或asp.net web/web api服务器 其中一个客户端(比如客户端A)点击缓存获取数据,但未命中(数据不在缓存中)。然后,客户机开始获取真实数据(比如从数据库中),然后在完成后将其设置到缓存中 客户机B出现并需要相同的数据,对缓存进行提取,由于未命中,因此执行相同的处理 客户机B是否有办法…(N)在数据进入缓存之前不进行处理(即转到数据库),而是在数据可用时从缓存中获取数据 我知道在单个应用程序

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

假设我有n个客户端,windows桌面应用程序或asp.net web/web api服务器

其中一个客户端(比如客户端A)点击缓存获取数据,但未命中(数据不在缓存中)。然后,客户机开始获取真实数据(比如从数据库中),然后在完成后将其设置到缓存中

客户机B出现并需要相同的数据,对缓存进行提取,由于未命中,因此执行相同的处理

客户机B是否有办法…(N)在数据进入缓存之前不进行处理(即转到数据库),而是在数据可用时从缓存中获取数据

我知道在单个应用程序(或web服务器)上,使用线程很容易检查这一点,但在分布式体系结构中

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

否则,我们的想法将大致如下:

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


谢谢

正如凯文所说,这叫做缓存踩踏。 关于这个问题,我读过的最好的文档之一是使用memcached:如何轻松地扩展您的网站(来自Josef Finsel):

在这个例子中,我们需要的是告诉我们的程序 另一个程序正在提取数据。最好的方法 将另一个memcached条目用作锁的句柄

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

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

当正在更新的进程 缓存完成后,它会删除锁密钥

你所描述的是一个例子。如果你看那篇文章的缓解部分,你会看到基本的想法,如果你环顾四周,你会发现一些试图在Redis中处理这个问题的库。