【问题标题】:Persistent memory cache for Windows Applications? [closed]Windows 应用程序的持久内存缓存? [关闭]
【发布时间】:2014-08-14 21:04:55
【问题描述】:

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

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

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

映射表结构:

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

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

最好的方法是什么?

【问题讨论】:

  • 作为“搜索工具”,这可能会因为离题而关闭。您可能想澄清为什么您的 WinForms 应用程序需要 MemCacheD 之类的东西......可能有更简单的方法来解决原始问题(除非您在“我的应用程序使用太多内存”出现时试图将矛头指向其他人)。

标签: c# winforms caching memorycache


【解决方案1】:

是的,您可以使用与ManagedEsent 捆绑在一起的PersistentDictionary。它实际上是 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. 规模:一个集合最多可以包含 2^31 个对象,值的大小最大为 2GB。最大数据库大小为 16TB。

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多