GitHub地址:https://github.com/MichaCo/CacheManager
CacheManager的优点:
让开发人员的生活更容易处理和配资缓存,即使是非常复杂的缓存方案。
CacheManager能够管理多种缓存,包含 内存, appfabric, redis, couchbase, windows azure cache, memorycache等。
提供了额外的功能,如缓存同步、并发更新、事件、性能计数器等
一、安装
使用Nuget为项目添加CacheManager包引用,CacheManager包含了很多的Package. CacheManager.Core是必须的。
实例:
使用内存缓存;只需要CacheManager.Core和CacheManager.SystemRuntimeCaching
static void Main(string[] args)
{
var cache = CacheFactory.Build("getStartedCache", settings =>
{
settings.WithSystemRuntimeCacheHandle("handleName");
});//创建了一个名称为getStartedCache的缓存实例
cache.Add("keyA", "valueA");
cache.Put("keyB", 23);
cache.Update("keyB", v => 42);
//缓存区域
cache.Add("key", "value", "region");
var value = cache.Get("key", "region");
cache.Remove("key", "region");
Console.WriteLine("KeyA is " + cache.Get("keyA")); // should be valueA
Console.WriteLine("KeyB is " + cache.Get("keyB")); // should be 42
cache.Remove("keyA");
Console.WriteLine("KeyA removed? " + (cache.Get("keyA") == null).ToString());
Console.WriteLine("We are done...");
Console.ReadKey();
}
要创建缓存管理器实例,可以使用CacheFactory具有两种不同方法的类:
1、Build 可用于使用流畅的配置构建器创建新的缓存配置。
var cache = CacheFactory.Build(settings => settings
.WithUpdateMode(CacheUpdateMode.Up)
.WithSystemRuntimeCacheHandle()
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(10)));
2、FromConfiguration获取在应用程序文件中配置的CacheManagerConfiguration对象或nameed CacheManager app/web.config。
var cache = CacheFactory.FromConfiguration("cacheName")
可以分隔定义CacheManager实例的名称和配置的缓存的名称,以便从同一配置创建多个实例。缓存或缓存句柄名称通常是可选的。可用于调试/记录。
var cache = CacheFactory.FromConfiguration("cacheInstanceName", "configuredCacheName")
如果要分离创建配置对象和创建Cache Manager实例,则可以使用ConfigurationBuilder创建配置。
var cfg = ConfigurationBuilder.BuildConfiguration(settings =>
{
settings.WithUpdateMode(CacheUpdateMode.Up)
.WithSystemRuntimeCacheHandle("handleName")
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(10));
});
var cache = CacheFactory.FromConfiguration("cacheName", cfg);
cache.Add("key", "value");
var cache = CacheFactory.FromConfiguration("numbers", cfg);
配置json内容可以如下:
{
"$schema": "http://cachemanager.michaco.net/schemas/cachemanager.json#",
"redis": [
{
"key": "redisConnection",
"connectionString": "localhost:6379,allowAdmin=true"
}
],
"cacheManagers": [
{
"maxRetries": 1000,
"name": "cachename",
"retryTimeout": 100,
"updateMode": "Full",
"backplane": {
"key": "redisConnection",
"knownType": "Redis",
"channelName": "test"
},
"loggerFactory": {
"knownType": "Microsoft"
},
"serializer": {
"knownType": "Json"
},
"handles": [
{
"knownType": "SystemRuntime",
"enablePerformanceCounters": true,
"enableStatistics": true,
"expirationMode": "Absolute",
"expirationTimeout": "0:0:23",
"isBackplaneSource": false,
"name": "sys cache"
},
{
"knownType": "Redis",
"key": "redisConnection",
"isBackplaneSource": true
}
]
}
]
}
ConfigurationBuilder配置:http://cachemanager.michaco.net/Documentation/CacheManagerConfiguration
二、多级缓存配置
将内存缓存结合分布式缓存使用,使用频率高的数据直接从内存中读取,这将大大提高应用程序的整体性能。
配置实例:
1 var cache = CacheFactory.Build("myCache", settings =>
2 {
3 settings
4 .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
5 .And
6 .WithRedisConfiguration("redis", config =>//Redis缓存配置
7 {
8 config.WithAllowAdmin()
9 .WithDatabase(0)
10 .WithEndpoint("localhost", 6379);
11 })
12 .WithMaxRetries(1000)//尝试次数
13 .WithRetryTimeout(100)//尝试超时时间
14 .WithRedisBackPlate("redis")//redis使用Back Plate
15 .WithRedisCacheHandle("redis", true);//redis缓存handle
16 });
三、分布式缓存中的同步问题Back Plate
对于大型的软件系统,常常都是分为很多独立的子项目,各个子项目为了节约成本或者是方便数据共享,常常会共用同一个分布缓存服务器。这样在使用多级缓存的时候,就有可能出现数据不一致的情况;为了防止这一点,缓存管理器有一个功能叫做cachebackplate将尝试同步多个系统中的缓存。面设置的多级缓存中,我们就将redis作为BackPlate的源. 也就是说所有的数据都需要以redis中缓存的数据为蓝本。
在设置redis作为BackPlate之后,同样发生上面的数据不一致的情况的时候,只要redis中的数据被修改了,就会触发CacheManager更新所有系统中的内存缓存中的数据,和redis中的数据保持一致。
四、ExpirationMode和CacheUpdateMode
过期方式
1 public enum ExpirationMode
2 {
3 None = 0,
4 Sliding = 1,滑动日期,偏移量
5 Absolute = 2,//绝对日期
6 }
更新策略
1 public enum CacheUpdateMode
2 {
3 None = 0,
4 Full = 1,
5 Up = 2,//默认,
6 }
可以为多级缓存设置不同的缓存过期时间,这样使用频率高的数据就能够保存在访问速度更快的内存中,访问频率次高的放到分布式缓存中。当在内存中找不到缓存数据的时候,就会尝试在分布式缓存中找。找到后,根据Up设置,会再将该缓存数据保存到内存缓存中。
实例:
1 var cache = CacheFactory.Build("myCache", settings =>
2 {
3 settings.WithUpdateMode(CacheUpdateMode.Up)
4 .WithSystemRuntimeCacheHandle("inProcessCache")//内存缓存Handle
5 .WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(60)))
6 .And
7 .WithRedisConfiguration("redis", config =>//Redis缓存配置
8 {
9 config.WithAllowAdmin()
10 .WithDatabase(0)
11 .WithEndpoint("localhost", 6379);
12 }).
13 .WithExpiration(ExpirationMode.Sliding, TimeSpan. FromHours (24)))
14 .WithMaxRetries(1000)//尝试次数
15 .WithRetryTimeout(100)//尝试超时时间
16 .WithRedisBackPlate("redis")//redis使用Back Plate
17 .WithRedisCacheHandle("redis", true);//redis缓存handle
18
19 });
五、日志
CacheManager.Core带有自己的日志记录接口CacheManager.Core.Logging,该接口在内部用于记录标准高速缓存操作,并跟踪CacheManager正在做出的决策。可以使用Microsoft.Extensions.Logging打印日志输出到控制台,要使用例如Console日志记录,必须安装Microsoft.Extensions.Logging.Console。要使用Debug目标,还必须安装Microsoft.Extensions.Logging.Debug
var builder = new Core.ConfigurationBuilder("myCache");
builder.WithMicrosoftLogging(f =>
{
f.AddConsole(LogLevel.Information);
f.AddDebug(LogLevel.Verbose);
});
如果已经使用Microsoft.Extensions.Logging.ILoggerFactory进行的日志记录并希望CacheManager使用相同的实例。则使用如下方式:
.WithMicrosoftLogging(loggerFactory)