Cache缓存在计算机领域是一个被普遍使用的概念。硬件中CPU有一级缓存,二级缓存, 浏览器中有缓存,软件开发中也有分布式缓存memcache, redis。缓存无处不在的原因是它能够极大地提高硬件和软件的运行速度。在项目开发中,性能慢的地方常常是IO操作频繁的地方,读取数据库是我们常见的消耗性能的地方。这个时候,如果将使用频繁的数据缓存到能够高速读取的介质中,下次访问时,不用再去请求数据库,直接从缓存中获取所需的数据,就能够大大提高性能。这篇文章主要讨论的是在.Net开发中,如何使用CacheManager框架方便的管理项目中的缓存。
一,CacheManager介绍以及优点
CacheManager是开源的.Net缓存管理框架。它不是具体的缓存实现,而是在缓存之上,方便开发人员配置和管理各种不同的缓存,为上层应用程序提供统一的缓存接口的中间层。
下面是CacheManager的一些优点:
- 让开发人员更容易处理和配置缓存,即使是非常复杂的缓存方案。
- CacheManager能够管理多种缓存,包含内存、appfabric、redis、couchbase、 windows azure cache、memorycache等。
- 提供了额外的功能,如缓存同步、并发更新、事件、性能计数器等…
二,CacheManager开始之旅
CacheManager上手还是非常简单的。下面使用内存缓存结合CacheManager的一个实例,能够帮助我们快速的熟悉CacheManager如何使用。
首先在Visual Studio中创建一个Console Application.
使用Nuget为项目添加CacheManager包引用。CacheManager包含了很多的Package. 其中CacheManager.Core是必须的,其它的针对不同缓存平台上有不同的对应Package.
这个Demo中,我们使用内存作为缓存,所以只是需要CacheManager.Core和CacheManager.SystemRuntimeCaching
接着在Main函数中配置好我们的缓存:
1 using System; 2 using CacheManager.Core; 3 namespace ConsoleApplication 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var cache = CacheFactory.Build("getStartedCache", settings =>
10 { 11 settings.WithSystemRuntimeCacheHandle("handleName"); 12 }); 13 } 14 } 15 }
上面代码中使用CacheFactory创建了一个名称为getStartedCache的缓存实例,这个缓存实例使用的是SystemRunTime Cache, 内存缓存。一个缓存实例是可以配置多个Handle的,我们可以使用内存来作为存储介质,也可以使用Redis分布式缓存作为存储介质,并且可以同时在一个缓存实例中使用,后面我们再介绍多级缓存的配置和使用。
接下来,我们添加一些测试缓存的代码
1 static void Main(string[] args) 2 {
4 var cache = CacheFactory.Build("getStartedCache", settings =>
5 { 6 settings.WithSystemRuntimeCacheHandle("handleName"); 7 }); 8
9 cache.Add("keyA", "valueA"); 10 cache.Put("keyB", 23); 11 cache.Update("keyB", v => 42); 12 Console.WriteLine("KeyA is " + cache.Get("keyA")); // should be valueA
13 Console.WriteLine("KeyB is " + cache.Get("keyB")); // should be 42
14 cache.Remove("keyA"); 15 Console.WriteLine("KeyA removed? " + (cache.Get("keyA") == null).ToString()); 16 Console.WriteLine("We are done..."); 17 Console.ReadKey(); 18 }
三,CacheManager多级缓存配置
实际开发中,我们常常会需要使用多级缓存。
一种常见的情况是,你有一个分布式式缓存服务器,例如redis,独立的缓存服务器能够让我们的多个系统应用程序都能够共享这些缓存的数据,因为这些缓存项的创建是昂贵的。
和访问数据库相比,分布式缓存速度较快,但是和内存相比,还是不够快。因为分布式缓存使用还需要序列化和网络传输的时间消耗。
这个时候里,做个分级缓存是个好的解决方案,将内存缓存结合分布式缓存使用,使用频率高的数据直接从内存中读取,这将大大提高应用程序的整体性能。
使用内存缓存的读取速度能够达到分布式缓存的100倍,甚至更高。
使用CacheManager, 配置多级缓存是一件非常容易的事情
1 var cache = CacheFactory.Build<int>("myCache", settings =>
2 { 3 settings 4 .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
5 .And 6 .WithRedisConfiguration("redis", config =>//Redis缓存配置
7 { 8