CacheManager使用

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<string>("cacheName")
可以分隔定义CacheManager实例的名称和配置的缓存的名称,以便从同一配置创建多个实例?;捍婊蚧捍婢浔仆ǔJ强裳〉摹?捎糜诘魇?记录。
var cache = CacheFactory.FromConfiguration<int>("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<string>("cacheName", cfg);
cache.Add("key", "value");
var cache = CacheFactory.FromConfiguration<int>("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<int>("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<int>("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正在做出的决策??梢允褂肕icrosoft.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)

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容