System.Web.Caching与企业库缓存块
对于将同时在Web应用程序和富客户端应用程序中使用的.NET组件,似乎有两个明显的缓存选项:System.Web.Caching或者Ent。解放缓存块。
- 你用什么?
- 为什么?
System.Web.Caching
在Web应用程序外部使用安全吗?我已经看到了混合的信息,但是我认为答案可能不是真的。
- KB文章警告,禁止1.0和1.1非Web应用程序使用
- 2.0页上有一条注释,指出它可以:http://msdn.microsoft.com/zh-cn/library/system.web.caching.cache(VS.80).aspx
- 斯科特·汉瑟曼(Scott Hanselman)被这个想法吓到了
- 3.5页包含禁止此类使用的警告
- Rob Howard鼓励在Web应用程序之外使用
我不希望使用它的亮点之一SqlCacheDependency,但是在.NET 3.5中添加CacheItemUpdateCallback似乎是一件很不错的事情。
企业库缓存应用程序块
- 其他块已经在使用中,因此依赖项已经存在
- 缓存持久性不是必需的;重新启动时重新生成缓存是可以的
某些缓存项应始终可用,但应定期刷新。对于这些项目,在删除项目后获取回调不是很方便。看起来客户端将只需要睡眠和轮询,直到重新填充缓存项为止。
Win32 + .NET客户端的Memcached
当我们不需要分布式缓存时,优缺点是什么?
解决方案
回答
看看memcached。这是一个非常酷,快速且轻量级的分布式缓存系统。有针对几种最流行语言的API,包括C#。它可能无法很好地在客户端上使用(除非客户端当然要从某种服务器上获取缓存的数据),但是如果将memcached的用法抽象到特定的接口,则可以使用另一个缓存来实现该接口系统。
回答
请记住,EntLib文档专门将我们引向ASP.NET应用程序的ASP.NET缓存。这可能是在这里使用它的最强建议。再加上EntLib缓存不具有依赖项,这对我来说是不使用它的一个重要原因。
我不认为将System.Web作为应用程序的一部分存在技术上的限制,尽管他们将通知放在.NET 3.5页面上有点奇怪。汉瑟曼实际上说他开始被这个想法所迷惑,但是被说服了。另外,如果我们阅读了注释,他说该块包含太多活动部件,并且ASP.NET Cache更轻巧。
我认为这正是Velocity要解决的问题,但这只是目前的预览:-(
我会说使用Web.Caching并看看我们如何进行。如果我们在其顶部放置某种抽象层,则始终可以选择在以后发现问题时将其替换为EntLib块。
回答
@戴维·沃斯蒂(Davide Vosti)
"如果他们将其放在Web名称空间中,我认为这是有充分的理由的。"
相同的逻辑是否适用于机器人工作室中的并发和协调运行时(CCR)?不?不这么认为。
回答
这些是我考虑的有关缓存主题的项目:
MemCached Win32
速度
.net缓存
企业库缓存应用程序块
MemCached Win32:直到最近我都使用过MemCached Win32. 这类似于Web场(许多服务器提供相同内容以实现高可用性),但它是一个缓存场。这意味着,如果我们没有足够的资源来扩展它,则可以首先将其本地安装在Web服务器上。然后,当我们沿着这条路走时,可以水平扩展(更多服务器)或者垂直扩展(更多硬件)。这是从原始MemCached移植到Windows上的产品。该产品已被广泛用于人流量大的场所。 http://lineofthought.com/tools/memcached
速度:这是Microsoft对诸如MemCached之类的产品的回答。 MemCached已经退出了很长一段时间,Velocity处于CTP模式。我必须说,到目前为止,从阅读的内容来看,这款产品肯定会打动我的头。但是我不能让自己在零记录的CTP产品上运行大型生产项目。我已经开始使用它了,尽管它一度获得了发展,但MemCached甚至无法与锁定在Windows世界中的用户进行比较! http://blogs.msdn.com/velocity/
.NET缓存:没有理由打折标准的.NET缓存。它是内置的,可以免费使用,并且不需要(主要)设置。它通过提供用于将项目存储在本地内存,单状态服务器或者集中式数据库中的机制来提供灵活性。当需要多个状态服务器(内存中的缓存)并且不想使用慢速数据库来保存缓存时,Velocity介入的地方。
企业应用程序块:我远离所有企业应用程序块。它们是沉重的框架,可以提供比我通常所需的更多的东西!只要我们记得包装所有涉及非我们自己的代码的内容并遵循简单的编码规则,就可以坚持使用该方法中的任何其他方法! (当然,我的观点当然是MySpace在企业应用程序块中发挥了最大的作用!)
我们不必预先选择!我通常会在我的代码中为诸如Get,Set,Exists,Remove,ListKeys等方法创建一个与之通信的缓存包装器。然后,该缓存包装器指向可能指向MemCached,Velocity或者.NET的底层缓存抽象级别。缓存。我使用StructureMap(或者选择另一个IoC容器)来注入要在给定环境中使用的高速缓存形式。在我的本地开发框中,我可能在会话中使用.NET缓存。在生产环境中,我通常使用MemCached Win32. 但是,无论如何设置,我们都可以轻松地交换内容来尝试每个系统,以查看最适合系统。我们只需要确保应用程序对事物的缓存方式了解得最少即可!一旦建立了这一抽象层,我们就可以执行诸如对所有进出缓存的数据运行压缩算法(gzip)的操作,这将使我们可以在缓存中存储10倍的数据量。透明地。
如果我们有兴趣,我将在我的书中介绍.NET Cache,MemCached Win32,StructureMap和相应的抽象!
ASP.NET 3.5社交网络(http://www.amazon.com/ASP-NET-3-5-Social-Networking-Enterprise-ready/dp/1847194788/ref=sr_1_1?ie=UTF8&s=books&qid=1225408005&sr=8 -1)
Andrew Siemer www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net
更新
更改了使用memcached列出站点的链接。谢谢David注意到它已损坏!