【愚公系列】2022年12月 Redis数据库-Cache和Redis缓存的无缝切换使用

2022-12-09 13:46:26 浏览数 (1)

文章目录

  • 前言
  • 一、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缓存执行情况

0 人点赞