2

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

是否有可以通过 NuGet 使用的持久内存缓存?

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

映射表的结构:

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

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

最好的方法是什么?

4

1 回答 1

2

是的,您可以使用PersistentDictionaryManagedEsent. 它实际上是 Esent 的托管包装器。

它与Dictionary<K, V>. 坚持是在幕后完成的。

您需要将数据构造成键值对格式缓存。值也受某些条件的影响。请参阅Supported Value Types我链接的页面中的部分。

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

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