目录
IDistributedCache接口中定义的主要方法及主要的扩展方法
分布式缓存
概述
分布式系统中,内存缓存不满足要求的话,把缓存数据保存到专门的缓存服务器,所有Web应用通过缓存服务器进行缓存数据的写入和获取。
- 常用的分布式缓存服务器有Redis、Memcached等。
- .NET Core中提供了统一的分布式缓存服务器的操作接口IDistributedCache,用法和内存缓存类似。
- 分布式缓存和内存缓存的区别:缓存值的类型为byte[],需要我们进行类型转换,也提供了一些按照string类型存取缓存值的扩展方法。
IDistributedCache接口中定义的主要方法及主要的扩展方法
用什么做缓存服务器
- 用SQLServer做缓存性能并不好。
- Memcached是缓存专用,性能非常高,但是集群、高可用等方面比较弱,而且有“缓存键的最大长度为250字节”等限制。可以安装EnyimMemcachedCore这个第三方NuGet包。
- Redis不局限于缓存,Redis做缓存服务器比Memcached性能稍差,但是Redis的高可用、集群等方便非常强大,适合在数据量大、高可用性等场合使用。
使用
Install-Package Microsoft.Extensions.Caching.StackExchangeRedis
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "cache_";//避免混乱
});
private readonly IDistributedCache distributedCache;
[HttpGet]
public async Task<ActionResult<Book?>> Test(long id)
{
Book? book = null;
string? s = await distributedCache.GetStringAsync("Book_" + id);
if (s == null)
{
book = await ctx.Set<Book>().SingleOrDefaultAsync(o => o.Id == id);
await distributedCache.SetStringAsync("Book_" + id, JsonSerializer.Serialize(book));
}
else
{
book = JsonSerializer.Deserialize<Book?>(s);
}
if (book == null)
{
return NotFound("不存在");
}
else
{
return Ok(book);
}
}
封装分布式缓存操作
Install-Package Zack.ASPNETCore
//分布式缓存操作帮助类
services.AddScoped<IDistributedCacheHelper,DistributedCacheHelper>();
private readonly IDistributedCacheHelper distributedCacheHelper;
[HttpGet]
public async Task<ActionResult<Book?>> Test(long id)
{
var book =await distributedCacheHelper.GetOrCreateAsync("Book_" + id, async (e) =>
{
e.SlidingExpiration = TimeSpan.FromSeconds(5);
var book = await ctx.Set<Book>().SingleOrDefaultAsync(o => o.Id == id);
return book;
}, 20);
if (book == null)
{
return NotFound("不存在");
}
else
{
return Ok(book);
}
}