EasyCaching
在 .NET 开发中,缓存是提高应用程序性能的关键技术之一。EasyCaching 是一个简单易用的缓存管理库,提供了基于内存、分布式缓存和多级缓存的解决方案。本文将详细介绍 EasyCaching 的使用。
# 环境配置
首先,我们需要在项目中添加 EasyCaching 库。可以通过 NuGet 包管理器或 .NET CLI 安装。
dotnet add package EasyCaching.Core
EasyCaching 支持多种缓存存储提供程序,包括内存、Redis、Memcached、SQLite、PostgreSQL、MySql 等。我们需要根据实际情况选择并安装对应的存储提供程序。
# 使用内存缓存
EasyCaching 内置了内存缓存,可以直接使用。下面的代码演示了如何在 .NET Core 项目中使用 EasyCaching 内存缓存。
using EasyCaching.Core;
public class MyClass
{
private readonly IEasyCachingProvider _cache;
public MyClass(IEasyCachingProviderFactory cacheFactory)
{
_cache = cacheFactory.GetCachingProvider("myMemoryCache");
}
public void AddToCache(string key, string value)
{
_cache.Set(key, value, TimeSpan.FromMinutes(10));
}
public string GetFromCache(string key)
{
return _cache.Get<string>(key);
}
}
在上面的代码中,我们首先通过 IEasyCachingProviderFactory
获取 IEasyCachingProvider
实例。IEasyCachingProvider
接口定义了一系列缓存操作方法,如 Set
、Get
、Remove
等。
Set
方法用于将数据存储到缓存中,需要传递键、值和过期时间。Get
方法用于从缓存中获取数据,需要传递键。如果键不存在,Get
方法将返回默认值。
# 使用分布式缓存
EasyCaching 还支持分布式缓存,可以使用 Redis、Memcached 或其他分布式缓存存储提供程序。下面的代码演示了如何在 .NET Core 项目中使用 EasyCaching Redis。
using EasyCaching.Core;
using EasyCaching.Redis;
public class MyClass
{
private readonly IEasyCachingProvider _cache;
public MyClass(IEasyCachingProviderFactory cacheFactory)
{
var redisOptions = new RedisOptions
{
DBConfig = new RedisDBOptions
{
Database = 0
},
Endpoints = new List<ServerEndPoint>
{
new ServerEndPoint("localhost", 6379)
}
};
_cache = cacheFactory.GetCachingProvider("myRedisCache", options => options.UseRedis(redisOptions));
}
public void AddToCache(string key, string value)
{
_cache.Set(key, value, TimeSpan.FromMinutes(10));
}
public string GetFromCache(string key)
{
return _cache.Get<string>(key);
}
}
在上面的代码中,我们首先创建了一个 RedisOptions
对象,用于配置 Redis 连接信息。Endpoints
属性指定 Redis 服务器的地址和端口号。DBConfig
属性指定 Redis 数据库的编号。
然后,我们使用 IEasyCachingProviderFactory
获取 IEasyCachingProvider
实例,并通过 options
参数配置 Redis 连接信息。在 AddToCache
和 GetFromCache
方法中,我们可以使用与内存缓存相同的 API。
# 使用多级缓存
EasyCaching 还支持多级缓存,可以在内存缓存和分布式缓存之间自动切换。下面的代码演示了如何在 .NET Core 项目中使用 EasyCaching 多级缓存。
using EasyCaching.Core;
using EasyCaching.Core.Configurations;
using EasyCaching.Core.Decoration;
public class MyClass
{
private readonly IEasyCachingProvider _cache;
public MyClass(IEasyCachingProviderFactory cacheFactory)
{
var options = new EasyCachingOptions
{
CachingProviderType = CachingProviderType.Redis,
MaxRdSecond = 120,
Order = new[] { CachingProviderType.Memory, CachingProviderType.Redis }
};
var memoryOptions = new MemoryCacheOptions();
var redisOptions = new RedisOptions
{
DBConfig = new RedisDBOptions
{
Database = 0
},
Endpoints = new List<ServerEndPoint>
{
new ServerEndPoint("localhost", 6379)
}
};
var cachingProviderOptions = new CachingProviderOptions
{
EnableLogging = true,
EnablePerformanceLog = true
};
var memoryProvider = new MemoryCacheDecorator("myMemoryCache", memoryOptions);
var redisProvider = new RedisCacheDecorator("myRedisCache", options =>
{
options.DBConfig = redisOptions.DBConfig;
options.Endpoints = redisOptions.Endpoints;
});
_cache = cacheFactory.GetCachingProvider("myMultiCache", options =>
{
options.UseEasyCaching(options =>
{
options.UseMemory(memoryProvider);
options.UseRedis(redisProvider);
});
options.EnableLogging = cachingProviderOptions.EnableLogging;
options.EnablePerformanceLog = cachingProviderOptions.EnablePerformanceLog;
});
}
public void AddToCache(string key, string value)
{
_cache.Set(key, value, TimeSpan.FromMinutes(10));
}
public string GetFromCache(string key)
{
return _cache.Get<string>(key);
}
}
在上面的代码中,我们首先创建了一个 EasyCachingOptions
对象,用于配置多级缓存选项。CachingProviderType
属性指定默认缓存存储提供程序。MaxRdSecond
属性指定内存缓存的最大过期时间(以秒为单位)。Order
属性指定缓存存储提供程序的优先级。
然后,我们分别创建了内存缓存和 Redis 缓存存储提供程序。在创建 Redis 缓存存储提供程序时,我们使用 RedisCacheDecorator
类,该类可以自动维护多级缓存之间的数据同步。
最后,我们通过 IEasyCachingProviderFactory
获取 IEasyCachingProvider
实例,并使用 options
参数配置多级缓存选项。在 AddToCache
和 GetFromCache
方法中,我们可以使用与内存缓存和分布式缓存相同的 API。
# 缓存清除和更新
EasyCaching 提供了多种缓存清除和更新方式。下面的代码演示了如何在 .NET Core 项目中清除和更新缓存。
using EasyCaching.Core;
public class MyClass
{
private readonly IEasyCachingProvider _cache;
public MyClass(IEasyCachingProviderFactory cacheFactory)
{
_cache = cacheFactory.GetCachingProvider("myCache");
}
public void AddToCache(string key, string value)
{
_cache.Set(key, value, TimeSpan.FromMinutes(10));
}
public string GetFromCache(string key)
{
return _cache.Get<string>(key);
}
public void RemoveFromCache(string key)
{
_cache.Remove(key);
}
public void UpdateCache(string key, string value)
{
_cache.Replace(key, value, TimeSpan.FromMinutes(10));
}
}
在上面的代码中,我们定义了 RemoveFromCache
和 UpdateCache
方法,分别用于清除缓存和更新缓存。Remove
方法用于删除缓存项,Replace
方法用于替换缓存项。
# 缓存get方法使用总结
// 单个provider的时候可以直接用IEasyCachingProvider
private readonly IEasyCachingProvider _provider;
public WeatherForecastController ( ILogger<WeatherForecastController> logger , IEasyCachingProvider provider )
{
_logger = logger;
this._provider = provider;
}
//同步方法
//Get方法第1个参数:缓存名字
//Get方法第2个参数:缓存不存在回调方法
//Get方法第3个参数:缓存时间
var str1 = this._provider.Get( "data1" ,
() =>
{
Console.WriteLine( "data1:" + now.ToString( DateFormatAll ) );
return now.ToString( DateFormatAll );
} ,
TimeSpan.FromMinutes( 1 ) );
//同步方法
var str2 = this._provider.Get<string>( "data2" ,
() =>
{
Console.WriteLine( "data2:" + now.ToString( DateFormatAll ) );
return now.ToString( DateFormatAll );
} ,
TimeSpan.FromMinutes( 2 ) );
//异步方法
var str3 = await this._provider.GetAsync<string>( "data_Async_3" ,
async () =>
{
Console.WriteLine( "data_Async_3:" + now.ToString( DateFormatAll ) );
return await Task.FromResult( now.ToString( DateFormatAll ) );
} ,
TimeSpan.FromMinutes( 3 ) );
//可以缓存类
//System.Data.DataSet System.Data.DataTable 官网有提到,不要缓存这种类型数据
var _class = this._provider.Get<MyClass>( "dataMyClass" ,
() =>
{
Console.WriteLine( "dataMyClass:" + now.ToString( DateFormatAll ) );
return new MyClass() { times = now , Name = "qq" , Value = 110 };
} ,
TimeSpan.FromMinutes( 1 ) );
# 总结
EasyCaching 是一个简单易用的缓存管理库,提供了基于内存、分布式缓存和多级缓存的解决方案。在使用 EasyCaching 时,我们需要根据实际情况选择并安装对应的缓存存储提供程序。在使用 EasyCaching 进行缓存操作时,我们可以使用与内存缓存和分布式缓存相同的 API。EasyCaching 还提供了多种缓存清除和更新方式,可以帮助我们更好地管理缓存。