什么是MemCached?简单的说其实它就是一个缓存存储/hash table,你几乎能用它来存储所有的东西,比如:对象.你不想去缓存整个页面而是想缓存对象或者从数据库中取出的数据那么用MemCached是个不错的选择,它能节省你的查询时间,减少务器的负载.
Memcached 不适合运行在Windows上,为了解决这个问题,我们可以通过用另一台安装了Linux的服务器运行Memcached ,为多台服务器提供缓存.当然如果你仅仅一台服务器那么就没必要用Memcached ,我们用 System.Web.Cache 就可以了.当然了你也可以用Velocity
我推荐你使用Memcached ,因为在ASP.NET MVC中应用分布式缓存它是最简单的方式,那么要使用Memcached ,我们就进行配置一番:
打开Web.config 文件,添加如下配置节点
<section name="cacheProvider" type="MemcachedProviders.Cache.CacheProviderSection, MemcachedProviders" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/> <sectiongroup name="enyim.com"> <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" /> </sectiongroup> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
添加如下节点指向Memcached服务器
<enyim .com> <memcached> <servers> <!-- 你的服务器--> <add address="127.0.0.1" port="11211" /> </servers> <socketpool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" /> </memcached> </enyim>
接着配置缓存驱动器
<cacheprovider defaultProvider="MemcachedCacheProvider"> <providers> <add name="MemcachedCacheProvider"type="MemcachedProviders.Cache.MemcachedCacheProvider, MemcachedProviders"keySuffix="_MySuffix_" defaultExpireTime="2000"/> </providers> </cacheprovider>
继续配置log4j
<log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"><conversionpattern value="%date [%thread] %-5level %logger [%property{NDC}]- %message%newline" /> </layout></appender><root><priority value="WARN"/><appender -ref ref="ConsoleAppender"> <filter type="log4net.Filter.LevelRangeFilter"> <levelmin value="WARN"/><levelmax value="FATAL"/> </filter> </appender> </root> </log4net>
假如你引用了所有相关的类库,下面是我的category 控制器,如果Memcached内存中不包含returnObj对象,那么我们将缓存它
public ActionResult Category() { var returnObj = DistCache.Get<list <CategoryObject>>("fullCatListObject"); if (returnObj == null) { P015.Modules.Categories.Categories _cat = new P015.Modules.Categories.Categories(); returnObj = _cat.getCatObject(); DistCache.Add("fullCatListObject", returnObj, new TimeSpan(29, 0, 0, 0)); } return View(returnObj); }
值得注意的是我们的对象应该序列化例如:
[Serializable] public class CategoryObject { public string CAT_NAME { get; set; } public int CAT_ID { get; set; } public int LEVEL { get; set; } }
如果你使用LINQ TO SQL ,那么你在设计模式下打开DBML文件,改变序列化模式选项为Unidirectional