Windows应用程序的持久内存缓存?

时间:2014-08-14 21:04:56

标签: c# winforms caching memorycache

我正在寻找即使在Windows窗体应用程序关闭后仍然存在的内存缓存。到目前为止,我唯一考虑的选择是在关闭应用程序之前使用二进制格式化程序将内存缓存对象写入文件。

我可以使用NuGet上的持久性内存缓存吗?

编辑: 我们在"映射"中有大约3000万行。需要每1小时查询约100,000次的表格。需要缓存的想法是避免使用查询堆积数据库。

映射表的结构:

Zip code             TimeZoneGMTOffset
---------------------------------------
12345                -6
12346                -5
...

我们将有大约100,000个配置文件,我们每小时都会对其进行解析。作为此解析的一部分,我们将根据其邮政编码查询时区偏移量,并使用它来计算时间范围。

最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用ManagedEsent捆绑的PersistentDictionary。它实际上是Esent的托管包装。

它与Dictionary<K, V>一样易于使用。持久性在幕后完成。

您需要构建要以键 - 值对格式缓存的数据。值也受某些条件的限制。请参阅我链接的页面中的Supported Value Types部分。

功能(来自他们的CodePlex页面):

  1. 无设置:ESENT数据库引擎是Windows的一部分,无需设置。 EsentCollections将适用于从XP开始的任何版本的Windows。
  2. 性能:ESENT支持高速率的更新和检索。预写日志记录降低了对数据进行小更新的成本。信息在进程中插入数据库或从数据库中检索,因此数据访问的开销非常低。 B树通过密钥提供对数据的O(log n)访问,并且记录按排序顺序存储。
  3. 简单性:PersistentDictionary的外观和行为类似于.NET Dictionary / SortedDictionary / SortedList类。不需要额外的方法调用。
  4. 免管理:ESENT自动管理数据库缓存大小,事务日志文件和崩溃恢复,因此无需进行数据库管理。代码的结构使得即使多个线程使用相同的字典也没有死锁或冲突。 ESENT在进程中运行,不会暴露任何网络访问,从而提供高度的安全性。
  5. 可靠性:ESENT的预写日志记录系统意味着在进程崩溃或意外的机器关闭(例如断电)后数据库会自动恢复。数据库事务用于确保数据库的逻辑一致性。
  6. 并发:每个数据结构都可以被多个线程访问。读取是非阻塞的,并且允许对集合中不同项目的更新同时进行。
  7. 缩放:一个集合最多可包含2 ^ 31个对象,值最大可达2GB。最大数据库大小为16TB。