【问题标题】:Should I MemoryCache a static object?我应该 MemoryCache 一个静态对象吗?
【发布时间】:2021-09-15 13:23:29
【问题描述】:

我有一个静态类,里面有一个静态列表。

public static class Translations {
    public static List<string> Resources {get; set;}
}

MemoryCache 那个 List 有意义吗?或者通过静态已经保存在内存中,所有用户的相同列表并且不需要memcache它?

【问题讨论】:

  • “保存在内存中”取决于很多东西;显示的列表将与应用程序域持续一样长,这通常意味着与进程一样长;但是,某些环境会主动回收进程,这会丢失列表;这里的实际情况是什么?另外:您是否曾经在该列表中添加/删除/等?因为如果你是:这里可能存在线程竞争条件
  • MVC / 是的,我也在更新列表。那我应该memcache吗?
  • 这两件事是无关的;您是否使用进程外缓存取决于 a:您的进程生命周期,以及 b:构建数据的成本 - 您还没有告诉我们这些事情中的任何一个;如果您要更新列表:您需要处理竞争问题 - 进程外缓存无济于事根本 - 它是一个完全独立的问题;这有点像问“我的车总是漏气;我应该把它涂成什么颜色?”
  • 我正在使用 MemoryCache.Default。这里没有花哨的东西。我将整个 DataTable 保存在内存中(RESX 中缺少一些翻译)
  • 啊,我明白了;你使用了“memcache”这个短语,我以为你的意思是进程外存储引擎——我的错,但我所说的大部分内容仍然存在

标签: c# caching memorycache


【解决方案1】:

如果我们谈论的是进程内内存,那么 static 字段的生命周期将与 MemoryCache.Default 中的任何内容完全相同,但该字段将更直接,因此更快。然而,更大的问题是如果您在分配列表之后更改列表的内容,则会出现竞争条件,因为多个线程可能同时查看数据(坏事)。使用某种不可变集合(例如ImmutableList&lt;T&gt;)可能是个好主意,以避免出现任何并发症。

【讨论】:

  • 感谢 ImmutableList ? 为什么我应该使用 MemoryCache.Default,当我可以简单地始终使用静态时?
  • @CătălinRădoi MemoryCache 更像是一个字符串键控字典,用于当您需要在构建时可能不知道的多个值时,例如:每个用户、每个区域等 - 通过组合一个键。它还包含线程安全问题、垃圾收集/容量问题以及其他一些在您的案例中并不真正适用的事情
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多