C# 架构建议 : method to cache data in a structure?

标签 c# caching memcached wcf

我想向您寻求有关 C# 中可行架构的专家建议。

我有一个 C# 服务,它响应 LAN 上本地用户的请求,从互联网获取数据包,并处理该数据以在结构中生成数据数组。每个数据请求大约需要2秒,返回4000字节。每天可能有数万个请求。

为了加快一切速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问可以立即提供给 LAN 上的任何其他用户(可能有超过 50 个用户)。

限制:

  1. 底层数据永远不会改变,即我不必担心“脏”数据(太棒了!)。
  2. 我想要缓存的数据是一个相当复杂的结构,包含日期时间、 double 等的嵌套数组。数据是通过互联网提供的数据进行大量数学运算的。
  3. 无论缓存多少数据,我都无法使用超过 100MB 的内存(即缓存的大小必须受到限制)。
  4. 我无法通过数字索引对缓存中的数据进行索引,我必须使用日期(“YYYY-MM-DD”)和唯一 ID 字符串(“XXXXXXXX”)的组合对其进行索引。<
  5. 它必须很快,即它必须从 RAM 中提供大部分响应。
  6. 缓存中的数据必须每 24 小时保存到磁盘。

这是我目前的选择:

  1. 使用私有(private)变量(即私有(private)列表或字典)将数据缓存在服务器类中,然后偶尔将其序列化到磁盘;
  2. 使用数据库;

我对您的专家意见感兴趣。

最佳答案

到目前为止,最简单的解决方案是使用 Dictionary<string, ComplexDataStructure>为此。

关于您的要求:

  1. 缓存的生命周期最容易管理,方法是使用后台线程每 10 分钟或一小时左右扫描一次缓存。随着ComplexDataStructure ,您存储 DateTime当创建缓存时,并在其生命周期到期后从字典中删除该键;

  2. 因为您存储的是实际的数据结构,所以复杂性不是问题;

  3. 限制大小可能很困难。 sizeof() equivalent for reference types?可以帮助您计算对象结构的大小。此操作并不简单,但您可以使用 ComplexDataStructure 存储结果。 。然后,当空间不足时,与 1. 使用的线程相同的线程可以删除条目。一个更简单的解决方案可能是使用 GC.GetTotalMemory()并确定进程的总内存使用量是否超出特定限制。然后,只需删除一个缓存项,然后在第二次运行时,当您发现仍然使用过多内存时,删除第二个缓存项;

  4. 只需使用字符串;

  5. 使用Dictionary<,>可能是通过禁食的方式减脂;

  6. 再次使用 1. 中的线程并实现此类逻辑。

确保正确处理锁定策略。这里最大的问题是,当另一个线程已经在处理数据时,您不希望进行处理。解决此问题的策略可能是以下策略:

  1. 锁定字典;

  2. 验证缓存项是否存在;

  3. 当缓存项不存在时:

    1. 创建一个空的缓存项;

    2. 将其添加到字典中;

    3. 对缓存项加锁;

    4. 释放字典上的锁;

    5. 进行数据处理;

    6. 将处理后的数据添加到缓存项中;

    7. 释放缓存项上的锁定;

  4. 当缓存项已存在时;

    1. 当缓存项确实具有经过处理的数据时,返回该数据;

    2. 当缓存项没有碾碎的数据时,对缓存项加锁;

    3. 在锁内部,将出现经过处理的数据(因为锁迫使您等待另一个线程)。

还有其他问题需要解决,但我认为这里描述了基本知识。

关于C# 架构建议 : method to cache data in a structure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4041128/

相关文章:

C# 连接到不同服务器上的mysql

caching - ColdFusion 客户端变量间歇性地显示过时的值

caching - CloudFlare 不考虑缓存控制 header

php - php 基于文件的缓存或 Opcache 哪一个更快

ruby-on-rails - Rails 使用 memcached 进行缓存,无法正常工作

java - 在 Google App Engine Java 上存储小型且简单的持久数据?

c# - 带有事件名称 lambda 表达式和自定义事件访问器的 WeakEventManager

c# - 为什么 ReadAllLines 在 WPF 中有效但在 ConsoleApp 中无效

c# - WPF ViewBox 缩放/大小更改事件

java - 更新哈希表中的缓存数据