Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本地缓存库C#(持久和加密)_C#_Performance_Caching_Encryption - Fatal编程技术网

本地缓存库C#(持久和加密)

本地缓存库C#(持久和加密),c#,performance,caching,encryption,C#,Performance,Caching,Encryption,我希望向用C#4编写的Windows桌面应用程序添加缓存 我的要求是保存到加密文件中的持久密钥值存储。我正在尝试缓存对服务器的远程调用,这些调用可能很慢,并且可能会缓存大量数据,即50+MB。我想能够设置一个最大文件大小的值与某种形式的LRU到期 我曾想过序列化一本字典,但这可能会有点慢初始化,并将有太大的内存占用 我认为一个加密的SQLCE4数据库可能是最好的解决方案,但当我真的只需要一个哈希表时,这似乎很重要。它本身也不提供过期等缓存类型的特性 任何人都可以提出其他值得考虑的建议,或者一些关

我希望向用C#4编写的Windows桌面应用程序添加缓存

我的要求是保存到加密文件中的持久密钥值存储。我正在尝试缓存对服务器的远程调用,这些调用可能很慢,并且可能会缓存大量数据,即50+MB。我想能够设置一个最大文件大小的值与某种形式的LRU到期

我曾想过序列化一本字典,但这可能会有点慢初始化,并将有太大的内存占用

我认为一个加密的SQLCE4数据库可能是最好的解决方案,但当我真的只需要一个哈希表时,这似乎很重要。它本身也不提供过期等缓存类型的特性


任何人都可以提出其他值得考虑的建议,或者一些关于优化序列化/反序列化的建议。

欢迎您查看我们的库。这是一个虚拟文件系统,您可以将数据放入文件中,并使用密钥作为文件名。不过,必须在代码中执行“过期”文件清理。SolFS提供内置加密(您可以添加自己的加密机制),并且能够保存大文件(每个文件几GB就可以了)。此外,如果您关心文件大小,SolFS还具有内置压缩功能

> P>优化序列化,您可以通过实现接口ISEIALIALILE并将其转换成XML或JSON或其他任何内容来创建自己的序列化方法。

您绝对应该考虑序列化。几个月前,我不断地使用它(包括尝试SQLCE),没有任何东西可以接近序列化对象的速度(在我的例子中,我使用的是自定义对象)——SQLCE作为序列化对象加载所花费的时间是序列化对象的2-3倍

如果内存占用太大,那么您应该重新考虑如何设计要持久化的内容。

我建议使用SQLCE4。SQLlite引擎被明确设计为在内存受限的环境中工作。内存与速度的决定权留给开发人员

允许您充分利用Microsoft数据库工具(DbProviderFactory、实体框架、服务器资源管理器等)。它本身也支持加密

考虑到如下模式,LRU实现将非常简单:

CREATE TABLE "cache" ("key" varchar(64) NOT NULL PRIMARY KEY, "value" text NOT NULL, "last_access" datetime NOT NULL);
CREATE INDEX "cache_lru" ON "cache" ("last_access");
和的组合可能有用


您可以使用protobuf net快速进行序列化/反序列化。(有关将“Person”对象持久化到二进制文件的示例,请参阅《入门指南》)。protobuf还有返回字节[]的方法,因此您可以将其传递给加密程序,以避免重新读取字节流。

您是否尝试过将字典序列化?根据我的经验,文件反序列化通常是非常快的。我没有-50MB+字典的内存开销是我在性能提升之前考虑的问题