【发布时间】:2011-12-14 16:27:43
【问题描述】:
我目前能够将我创建的对象存储到HttpContext.Current.Session,并且我遇到了protobuf-net。有没有办法通过使用 protobuf 序列化对象来存储我的对象?
看起来 protobuf 想要将信息存储到 Stream 中,那么我应该(可以吗?)将 Stream 对象存储到用户会话中?或者我应该先将它从Stream 转换为另一种对象类型?如果是这样,转换序列化对象是否会绕过使用protobuf的原始目的(cpu使用率,内存使用率)?以前有人做过吗?
我的目标是使用 protobuf 作为压缩层,将信息存储到用户会话中。是否有更好的方法(更小的尺寸、更快的压缩、更易于维护、更小的实现开销)来执行此操作,或者 protobuf 是否适合此任务?
更新
我正在使用这个类对象
[Serializable]
public class DynamicMenuCache
{
public System.DateTime lastUpdated { get; set; }
public MenuList menu { get; set; }
}
这个类是我的 MenuList 类的包装器,它(基本上)是一个包含内置类型(字符串、整数)的列表列表。我创建了包装器以将时间戳与我的对象相关联。
如果我有一个会话缓存未命中(会话键为 null 或 session.lastUpdated 大于全局存储时间),我会进行正常的数据库查找 (MSSQL),创建 MenuList 对象,并将其存储到会话,像这样
HttpContext.Current.Session.Add("DynamicMenu" + MenuType, new DynamicMenuCache()
{
lastUpdated = System.DateTime.Now,
menu = Menu
});
目前我们的会话存储在内存中,但将来我们可能会转移到数据库会话存储中。
我们的会话使用量非常大,因为我们在其中存储了许多大对象(尽管我希望在将来某个时候清理我们存储在会话中的内容)。
例如,我们将每个用户的权限集存储到他们的会话存储中,以避免数据库命中。目前有很多权限和权限存储结构存储到会话中。
此时我只是查看可用的选项,因为我想在未来更智能、更严格地使用会话缓存。
如果您还有其他需要,请告诉我。
【问题讨论】:
-
我想这取决于你的状态对象的复杂性/大小,对象越大,你就越能从 protobuf 中受益。对于简单的对象,双重序列化可能是一种惩罚。编辑:您可以针对不同的会话对象对 memcached + protobuff 实现与经典的 asp.net 会话状态服务器进行基准测试,这会很有趣:)
-
您好 JesseB - 您目前的设置是什么?您当前使用的是哪个会话提供程序?在记忆中? SQL?或者...?另外:您的会话使用范围有多广?另外,您在会话中存储了哪些类型的东西? (这样我才能给出最合适的指导)
-
刚刚注意到更新(注意:我没有收到自动通知 - 您可能需要添加
@marc评论以便我看到它;p)。有点晚了,很累 - 我可以保证明天阅读并回复吗? -
@MarcGravell 哎呀我的错;p 是的,这很酷。我还在
research phase中,所以暂时没有什么是一成不变的。我只是在四处寻找一些可以很好用的东西。
标签: c# .net caching protobuf-net