GitHub地址:https://github.com/MichaCo/CacheManager
CacheManager的優(yōu)點(diǎn):
讓開發(fā)人員的生活更容易處理和配資緩存工坊,即使是非常復(fù)雜的緩存方案。
CacheManager能夠管理多種緩存瘫寝,包含 內(nèi)存, appfabric, redis, couchbase, windows azure cache, memorycache等。
提供了額外的功能,如緩存同步白华、并發(fā)更新、事件贩耐、性能計(jì)數(shù)器等
一弧腥、安裝
使用Nuget為項(xiàng)目添加CacheManager包引用,CacheManager包含了很多的Package. CacheManager.Core是必須的潮太。
實(shí)例:
使用內(nèi)存緩存管搪;只需要CacheManager.Core和CacheManager.SystemRuntimeCaching
static void Main(string[] args)
{
var cache = CacheFactory.Build("getStartedCache", settings =>
{
settings.WithSystemRuntimeCacheHandle("handleName");
});//創(chuàng)建了一個名稱為getStartedCache的緩存實(shí)例
cache.Add("keyA", "valueA");
cache.Put("keyB", 23);
cache.Update("keyB", v => 42);
//緩存區(qū)域
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();
}
要創(chuàng)建緩存管理器實(shí)例虾攻,可以使用CacheFactory具有兩種不同方法的類:
1、Build 可用于使用流暢的配置構(gòu)建器創(chuàng)建新的緩存配置更鲁。
var cache = CacheFactory.Build(settings => settings
.WithUpdateMode(CacheUpdateMode.Up)
.WithSystemRuntimeCacheHandle()
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(10)));
2霎箍、FromConfiguration獲取在應(yīng)用程序文件中配置的CacheManagerConfiguration對象或nameed CacheManager app/web.config。
var cache = CacheFactory.FromConfiguration<string>("cacheName")
可以分隔定義CacheManager實(shí)例的名稱和配置的緩存的名稱澡为,以便從同一配置創(chuàng)建多個實(shí)例漂坏。緩存或緩存句柄名稱通常是可選的∶街粒可用于調(diào)試/記錄顶别。
var cache = CacheFactory.FromConfiguration<int>("cacheInstanceName", "configuredCacheName")
如果要分離創(chuàng)建配置對象和創(chuàng)建Cache Manager實(shí)例,則可以使用ConfigurationBuilder創(chuàng)建配置拒啰。
var cfg = ConfigurationBuilder.BuildConfiguration(settings =>
{
settings.WithUpdateMode(CacheUpdateMode.Up)
.WithSystemRuntimeCacheHandle("handleName")
.WithExpiration(ExpirationMode.Sliding, TimeSpan.FromSeconds(10));
});
var cache = CacheFactory.FromConfiguration<string>("cacheName", cfg);
cache.Add("key", "value");
var cache = CacheFactory.FromConfiguration<int>("numbers", cfg);
配置json內(nèi)容可以如下:
{
"$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
二驯绎、多級緩存配置
將內(nèi)存緩存結(jié)合分布式緩存使用,使用頻率高的數(shù)據(jù)直接從內(nèi)存中讀取谋旦,這將大大提高應(yīng)用程序的整體性能剩失。
配置實(shí)例:
1 var cache = CacheFactory.Build<int>("myCache", settings =>
2 {
3 settings
4 .WithSystemRuntimeCacheHandle("inProcessCache")//內(nèi)存緩存Handle
5 .And
6 .WithRedisConfiguration("redis", config =>//Redis緩存配置
7 {
8 config.WithAllowAdmin()
9 .WithDatabase(0)
10 .WithEndpoint("localhost", 6379);
11 })
12 .WithMaxRetries(1000)//嘗試次數(shù)
13 .WithRetryTimeout(100)//嘗試超時時間
14 .WithRedisBackPlate("redis")//redis使用Back Plate
15 .WithRedisCacheHandle("redis", true);//redis緩存handle
16 });
三、分布式緩存中的同步問題Back Plate
對于大型的軟件系統(tǒng)册着,常常都是分為很多獨(dú)立的子項(xiàng)目拴孤,各個子項(xiàng)目為了節(jié)約成本或者是方便數(shù)據(jù)共享,常常會共用同一個分布緩存服務(wù)器甲捏。這樣在使用多級緩存的時候乞巧,就有可能出現(xiàn)數(shù)據(jù)不一致的情況;為了防止這一點(diǎn)摊鸡,緩存管理器有一個功能叫做cachebackplate將嘗試同步多個系統(tǒng)中的緩存。面設(shè)置的多級緩存中蚕冬,我們就將redis作為BackPlate的源. 也就是說所有的數(shù)據(jù)都需要以redis中緩存的數(shù)據(jù)為藍(lán)本免猾。
在設(shè)置redis作為BackPlate之后,同樣發(fā)生上面的數(shù)據(jù)不一致的情況的時候囤热,只要redis中的數(shù)據(jù)被修改了猎提,就會觸發(fā)CacheManager更新所有系統(tǒng)中的內(nèi)存緩存中的數(shù)據(jù),和redis中的數(shù)據(jù)保持一致旁蔼。
四锨苏、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,//默認(rèn)棺聊,
6 }
可以為多級緩存設(shè)置不同的緩存過期時間伞租,這樣使用頻率高的數(shù)據(jù)就能夠保存在訪問速度更快的內(nèi)存中,訪問頻率次高的放到分布式緩存中限佩。當(dāng)在內(nèi)存中找不到緩存數(shù)據(jù)的時候葵诈,就會嘗試在分布式緩存中找裸弦。找到后,根據(jù)Up設(shè)置作喘,會再將該緩存數(shù)據(jù)保存到內(nèi)存緩存中理疙。
實(shí)例:
1 var cache = CacheFactory.Build<int>("myCache", settings =>
2 {
3 settings.WithUpdateMode(CacheUpdateMode.Up)
4 .WithSystemRuntimeCacheHandle("inProcessCache")//內(nèi)存緩存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)//嘗試次數(shù)
15 .WithRetryTimeout(100)//嘗試超時時間
16 .WithRedisBackPlate("redis")//redis使用Back Plate
17 .WithRedisCacheHandle("redis", true);//redis緩存handle
18
19 });
五、日志
CacheManager.Core帶有自己的日志記錄接口CacheManager.Core.Logging泞坦,該接口在內(nèi)部用于記錄標(biāo)準(zhǔn)高速緩存操作窖贤,并跟蹤C(jī)acheManager正在做出的決策》∷可以使用Microsoft.Extensions.Logging打印日志輸出到控制臺赃梧,要使用例如Console日志記錄,必須安裝Microsoft.Extensions.Logging.Console李根。要使用Debug目標(biāo)槽奕,還必須安裝Microsoft.Extensions.Logging.Debug
var builder = new Core.ConfigurationBuilder("myCache");
builder.WithMicrosoftLogging(f =>
{
f.AddConsole(LogLevel.Information);
f.AddDebug(LogLevel.Verbose);
});
如果已經(jīng)使用Microsoft.Extensions.Logging.ILoggerFactory進(jìn)行的日志記錄并希望CacheManager使用相同的實(shí)例。則使用如下方式:
.WithMicrosoftLogging(loggerFactory)