当前位置: 首页 > 工具软件 > CacheManager > 使用案例 >

cachemanage管理_CacheManager使用

梁丘波鸿
2023-12-01

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)

 类似资料: