关于缓存使用误区
缓存,大家都使用过,但不知道大家有没有碰到过什么问题. 以前在我们的porta项目,一开始是用企业库作为自己的缓存,但在后来中,我们发现那个缓存还是有很大问题.主要有3个方面
一是缓存大对象,我们一开时的缓存是把一个表里的所有东西查出来,然后再缓存的.同时也把很多不该缓存的东西都缓存进来,导致后面,每次加载缓存,都是非常慢. 而且也经常出现缓存丢失的现象.
二是,企业库的缓存是用了进程的内存来缓存的.因此没办法实现共享,尤其在f5负载均衡下,会出现从一台机跳到另外一台机的时候,缓存马上丢失了. 虽然这里我们后来通过配置F5,解决了这个问题.但不能共享缓存,依然会对我们的性能造成很大的影响.
三是,当时缓存对象那里我们也作了一定的封装,但没有实现基于接口的封装,所以后期我们要换其他缓存方案时,要大量更改代码.
所以最后,在我们架构优化的时候,我们决定用appfabric 作为我们的缓存服务器,同时所有组件都是基于接口编程的.
其实,刚开始我们也作了memcache 和appfabric进行了对比. 后来还是决定用appfabric作为我们的缓存服务.主要出自以下考虑.appfabric毕竟是微软Windows Azure的关键产品之一,它拥有高性能,高稳定性,功能强大. 再说我们定义的缓存组件是基于接口来定义的. 然后通过依赖注入来调用,所以当我们发现某个缓存组件不好用的时候,我们可以随时用其他cache方案来代替.
我们看重 appfabric,还看重如下几点.
1. 跟.net结合 更强.可以直接用来作session
2.可以作为orm的二级缓存.
NHibernate 和实体框架都可以使用 AppFabric 缓存作为二级缓存。Nhibernate 通过 nhibernate.caches.velocity 来启用此功能 (sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/)。实体框架通过由 Jaroslaw Kowalski 提供的 EFCachingProvider 来启用此功能 (code.msdn.microsoft.com/EFProviderWrappers)。
3.通过标签,来提高检索效率.
appfabric 可参考官网 http://msdn.microsoft.com/zh-cn/library/ee677312(v=azure.10).aspx
有关更多缓存使用误区,可参考.中文 http://kb.cnblogs.com/page/138696/ 英文http://www.codeproject.com/Articles/115107/Ten-Caching-Mistakes-that-Break-your-App