文章目录
- 前言
- 一、Cache和Redis缓存的无缝切换使用
- 1.安装包
- 2.服务配置
- 3.创建控制器
- 4.启动程序
前言
接下文:https://blog.csdn.net/aa2528877987/article/details/128235791
Redis是分布式缓存,是将数据随机分配到不同服务器的,catch属于单机缓存,只能本机访问。
Redis和Cache的区别吧
- Redis和cache都是将数据存放在内存中,都是内存数据库。不过cache还可用于缓存其他东西,例如图片、视频等等。
- Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
- 虚拟内存-Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
- 过期策略–cache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如业务配置进行设定
- 分布式–设定cache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
- 存储数据安全–cache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
- 灾难恢复–cache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
- Redis支持数据的备份,即master-slave模式的数据备份。
本文先介绍两个.Net Core 7自带的AddMemoryCache和AddDistributedMemoryCache方法:
AddMemoryCache
:对应的使用的是 IMemoryCache , 它永远代表内存缓存,这里直接默认注入,不需要做其它判断了。AddDistributedMemoryCache
:对应的是 IDistributedCache,他可以基于内存缓存来使用,也可以基于Redis缓存来使用。
一、Cache和Redis缓存的无缝切换使用
1.安装包
关于Redis缓存,这里统一使用Caching.CSRedis程序集(Caching.CSRedis和CSRedisCore是一个东西)
2.服务配置
Program.cs
代码语言:javascript复制/*
说明:
(1). AddMemoryCache 对应的使用的是 IMemoryCache , 它永远代表内存缓存,这里直接默认注入,不需要做其它判断了。
(2). AddDistributedMemoryCache 对应的是 IDistributedCache,他可以基于内存缓存来使用,也可以基于Redis缓存来使用,二者可以无缝切换,详见下面参数配置
*/
builder.Services.AddMemoryCache(); //默认注入了内存
switch (builder.Configuration["CacheType"])
{
//内存
case "DistributedCache":
{
builder.Services.AddDistributedMemoryCache();
}; break;
//redis分布式缓存
case "RedisCache":
{
var csredis = new CSRedisClient(builder.Configuration["RedisStr"]);
builder.Services.AddSingleton<IDistributedCache>(new CSRedisCache(csredis));
}; break;
default: throw new Exception("缓存类型无效");
}
配置文件appsettings.json
代码语言:javascript复制{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"CacheType": "RedisCache", //DistributedCache,RedisCache
//Redis连接字符串 【119.45.xx.xx:6379,password=123456,defaultDatabase=1】
"RedisStr": "localhost:6379,defaultDatabase=1"
}
3.创建控制器
CacheOrRedisController
代码语言:javascript复制[Route("api/[controller]/[action]")]
[ApiController]
public class CacheOrRedisController : ControllerBase
{
public IMemoryCache memoryCache { get; set; }
public IDistributedCache distributedCache { get; set; }
public CacheOrRedisController(IMemoryCache MemoryCache, IDistributedCache DistributedCache)
{
memoryCache = MemoryCache;
distributedCache = DistributedCache;
}
/// <summary>
/// 内存缓存
/// </summary>
/// <returns></returns>
[HttpGet]
public string TestMemoryCache()
{
//获取缓存没有则创建
string myTime = memoryCache.GetOrCreate("Cache", (cacheEnty) =>
{
//模拟数据库中查询的结果写入缓存
return DateTime.Now.ToString();
})!;
return myTime;
}
/// <summary>
/// 内存缓存和Redis缓存无缝切换
/// </summary>
/// <returns></returns>
[HttpGet]
public string TestDistributedCache()
{
var myTime = distributedCache.GetString("Redis")!;
if (string.IsNullOrEmpty(myTime))
{
//从数据库中查询 写入缓存
distributedCache.SetString("Redis", DateTime.Now.ToString());
}
return myTime;
}
}
4.启动程序
Cache缓存执行情况
Redis缓存执行情况