我想请教您有关 C# 可行架构的专家建议。
我有一个 C# 服务,它响应 LAN 上本地用户的请求,从互联网获取数据包,并处理该数据以在结构中生成数据数组。每个数据请求大约需要2秒,返回4000字节。每天可能有数万个请求。
为了加快一切速度并减少带宽,我需要缓存数据处理的结果,以便第二次和后续访问立即提供给 LAN 上的任何其他用户(可能有超过 50 个用户)。
限制条件:
- 底层数据永远不会改变,即我不必担心“脏”数据(太棒了!)。
- 我想要缓存的数据是一个相当复杂的结构,包含日期时间、双精度数等的嵌套数组。数据是从互联网提供的数据中使用大量数学运算进行处理的。
- 无论缓存多少数据,我都不能使用超过 100MB 的内存(即缓存必须有大小限制)。
- 我无法通过数字索引对缓存中的数据进行索引,我必须使用日期(“YYYY-MM-DD”)和唯一 ID 字符串(“XXXXXXXX”)的组合对其进行索引。
- 它必须很快,即它必须从 RAM 中提供大部分响应。
- 缓存中的数据必须每24小时持久化到磁盘。
以下是我目前的选择:
- 使用私有变量(即私有列表或字典)将数据缓存在服务器类中,然后偶尔将其序列化到磁盘;
- 使用数据库;
我对您的专家意见很感兴趣。
到目前为止,最简单的解决方案是使用Dictionary<string, ComplexDataStructure>
为了这。
关于您的要求:
缓存的生命周期最容易管理,方法是使用后台线程每 10 分钟或一小时左右扫描一次缓存。随着ComplexDataStructure
,你存储一个DateTime
当创建缓存并在其生命周期到期后从字典中删除该键;
因为您存储的是实际的数据结构,所以复杂性不是问题;
限制大小可能很困难。sizeof() 相当于引用类型? https://stackoverflow.com/questions/26570/sizeof-equivalent-for-reference-types可以帮助您计算对象结构的大小。此操作并不简单,但您可以将结果存储为ComplexDataStructure
。然后,当空间不足时,与 1. 使用的线程相同的线程可以删除条目。一个更简单的解决方案可能是使用GC.GetTotalMemory()
并确定进程的总内存使用量是否超出特定限制。然后,只需删除一个缓存项,然后在第二次运行时,当您发现仍然使用太多内存时,删除第二个;
只需使用字符串即可;
使用Dictionary<,>
可能是减脂最快的方法;
再次使用 1. 中的线程并实现此类逻辑。
确保正确处理锁定策略。这里最大的问题是,当另一个线程已经在处理数据时,您不希望进行处理。解决这个问题的方法可能是以下策略:
锁定词典;
验证缓存项是否存在;
-
当缓存项不存在时:
创建一个空的缓存项;
将其添加到字典中;
对缓存项加锁;
释放字典上的锁;
进行数据处理;
将处理后的数据添加到缓存项中;
释放缓存项上的锁;
-
当缓存项已经存在时;
当缓存项确实具有经过处理的数据时,返回该数据;
当缓存项没有被粉碎的数据时,对该缓存项加锁;
在锁内部,将出现经过处理的数据(因为锁迫使您等待另一个线程)。
还有其他问题需要解决,但我认为这里描述了基础知识。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)