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

举报
愚公搬代码 发表于 2022/12/30 23:10:03 2022/12/30
【摘要】 前言接下文:https://blog.csdn.net/aa2528877987/article/details/128235791Redis是分布式缓存,是将数据随机分配到不同服务器的,catch属于单机缓存,只能本机访问。Redis和Cache的区别吧Redis和cache都是将数据存放在内存中,都是内存数据库。不过cache还可用于缓存其他东西,例如图片、视频等等。Redis不仅仅支...

前言

接下文: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

/*
 说明: 
 (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

{
  "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

[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缓存执行情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。