System.Web.Cache 和 HttpRuntime.Cache 内存位置

Posted

技术标签:

【中文标题】System.Web.Cache 和 HttpRuntime.Cache 内存位置【英文标题】:System.Web.Cache and HttpRuntime.Cache memory location 【发布时间】:2013-03-22 12:19:05 【问题描述】:

我有一个 WCF 服务,它使用 HttpRuntime.Cache 将客户列表存储 60 分钟

如果您运行以下内容,为什么字符串第三次包含“string3”

  string mykey = "mykey-1";
    List<string> strings = null;

    strings = HttpRuntime.Cache[mykey] as List<string>;

    if (strings == null)
    
        strings = new List<string>();
        strings.Add("string1");
        strings.Add("string2");
        HttpRuntime.Cache[mykey] = strings;
    
    else
    
        strings.Add("string3");
    

我希望:

第一轮:字符串对象为空,因此添加了“string1”和“string2”并将其缓存

第二轮:从缓存中取出字符串,并添加“string3”

第三轮:字符串从缓存中拉出,但在您再次添加“string3”之前,它已经得到了它。

它是共享内存还是应用程序池中的东西。如果您将其从缓存中拉出然后更改它,它会更改缓存版本而无需重新添加它。

如果我再次运行代码,我会得到另一个 'string3' 等

提前致谢

【问题讨论】:

它的行为应该和你期望的一样。它没有的原因不在这个问题中......你如何测试这段代码?循环运行3次? 不,我已将其复制到干净的网站并放入页面加载中。并按 F5 3 次 【参考方案1】:

List&lt;string&gt; 类是一个引用类型。这意味着您可以有多个引用同一实例的变量。如果您使用其中一个变量更改某些内容,则更改也将通过其他变量可见,因为它们实际上都引用了相同的对象/实例。

在您的示例中,在第一个请求中创建List&lt;string&gt; 的新实例,向其中添加一些字符串,然后将其添加到缓存中。所以在第一次请求之后,HttpRuntime.Cache 对象将持有对已创建的List&lt;string&gt; 实例的引用。

在第二个请求中,您将对该 List&lt;string 实例的引用分配给 strings 变量。所以strings 然后引用在第一个请求中创建的实例。而HttpRuntime.Cache 也仍然持有对同一个实例的引用。然后再向列表中添加一个字符串。 List&lt;string&gt; 的一个实例在内存中更新以包含新字符串。

在第三次运行时,您再次将对同一实例的引用复制到 strings 变量。这仍然引用在第一个请求中创建并随后在第二个请求中修改的完全相同的实例。因此,在第三个请求中,它已经包含 string3 值。由于List&lt;string&gt; 可以愉快地包含多个具有相同值的项目,因此第三个请求将向列表中添加另一个值为string3 的项目。之后的进一步请求等等。

你写的

它是共享内存还是应用程序池中的东西。如果你 将其从缓存中拉出然后更改它,它会更改缓存的版本 无需重新添加。

当您执行strings = HttpRuntime.Cache[mykey] as List&lt;string&gt;; 时,您并没有真正将其从缓存中拉出。相反,您正在创建对缓存中已引用的内容的引用。

所以答案是肯定的,通过您的本地引用(= strings 变量)完成的更改将“存储”在缓存中,无需重新添加。

【讨论】:

以上是关于System.Web.Cache 和 HttpRuntime.Cache 内存位置的主要内容,如果未能解决你的问题,请参考以下文章

使用这个插件,fiddler抓包直接生成httprunner脚本

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final