CacheManager使用

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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末房轿,一起剝皮案震驚了整個濱河市粤攒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱持,老刑警劉巖夯接,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纷妆,居然都是意外死亡盔几,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門掩幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逊拍,“玉大人,你說我怎么就攤上這事际邻⌒旧ィ” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵世曾,是天一觀的道長缨恒。 經(jīng)常有香客問我,道長轮听,這世上最難降的妖魔是什么骗露? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮血巍,結(jié)果婚禮上萧锉,老公的妹妹穿的比我還像新娘。我一直安慰自己述寡,他們只是感情好驹暑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布玫恳。 她就那樣靜靜地躺著,像睡著了一般优俘。 火紅的嫁衣襯著肌膚如雪京办。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天帆焕,我揣著相機(jī)與錄音惭婿,去河邊找鬼。 笑死叶雹,一個胖子當(dāng)著我的面吹牛财饥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播折晦,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼钥星,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了满着?” 一聲冷哼從身側(cè)響起谦炒,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎风喇,沒想到半個月后宁改,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魂莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年还蹲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耙考。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谜喊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倦始,到底是詐尸還是另有隱情斗遏,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布楣号,位于F島的核電站,受9級特大地震影響怒坯,放射性物質(zhì)發(fā)生泄漏炫狱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一剔猿、第九天 我趴在偏房一處隱蔽的房頂上張望视译。 院中可真熱鬧,春花似錦归敬、人聲如沸酷含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椅亚。三九已至限番,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呀舔,已是汗流浹背弥虐。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媚赖,地道東北人霜瘪。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像惧磺,于是被迫代替她去往敵國和親颖对。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容