gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:43:15 25 4
gpt4 key购买 nike

我想就 C# 中可行的架构征求您的专家意见。

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

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

约束:

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

这是我目前的选择:

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

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

最佳答案

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

关于您的要求:

  1. 缓存的生命周期最容易管理,方法是让后台线程每 10 分钟或大约 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com