想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
5年前关闭。
我正在寻找即使在Windows窗体应用程序关闭后仍然存在的内存缓存。到目前为止,我考虑过的唯一选择是在关闭应用程序之前,使用二进制格式化程序将内存缓存对象写入文件。
我可以使用NuGet上提供的持久性内存缓存吗?
编辑:
我们在“映射”表中大约有3000万行,每1小时需要查询100,000次。需要缓存的想法是避免使用查询来堆积数据库。
映射表的结构:
Zip code TimeZoneGMTOffset
---------------------------------------
12345 -6
12346 -5
...
我们将每小时大约解析100,000个配置文件。作为此解析的一部分,我们将针对其邮政编码查询时区偏移量,并使用其来计算时间范围。
最好的方法是什么?
最佳答案
是的,您可以使用PersistentDictionary
随附的ManagedEsent
。实际上,它是Esent上的托管包装。
和Dictionary<K, V>
一样容易使用。持久性是在幕后完成的。
您将需要以键值对格式构造要缓存的数据。值也受某些条件的影响。请参阅我链接的页面中的Supported Value Types
部分。
功能(从其CodePlex页面):
没有设置:ESENT数据库引擎是Windows的一部分,不需要设置。从XP开始,EsentCollections将可在任何Windows版本上使用。
性能:ESENT支持较高的更新和检索速度。预写日志记录减少了对数据进行小更新的成本。信息将插入到数据库中或从数据库中检索,因此数据访问的开销非常低。 B树通过键为O(log n)提供对数据的访问,并且记录按排序顺序存储。
简单性:PersistentDictionary的外观和行为类似于.NET Dictionary / SortedDictionary / SortedList类。不需要额外的方法调用。
免管理:ESENT自动管理数据库缓存大小,事务日志文件和崩溃恢复,因此不需要数据库管理。代码经过结构化,因此即使多个线程使用同一个字典,也不会出现死锁或冲突。 ESENT在进程内运行,并且不会暴露任何网络访问权限,从而提供高度的安全性。
可靠性:ESENT的预写日志记录系统意味着在进程崩溃或机器意外关闭(例如断电)之后,数据库将自动恢复。数据库事务用于确保数据库的逻辑一致性。
并发:每个数据结构可以由多个线程访问。读取是非阻塞的,并且允许同时进行对集合中不同项目的更新。
规模:一个集合最多可以包含2 ^ 31个对象,并且值的大小最多可以为2GB。最大数据库大小为16TB。
关于c# - Windows应用程序的持久性内存缓存? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25317592/