缓存是一种开发时常用的性能优化手段,.Net自带内存缓存(MemoryCache)可以很方便的使用,下面列出简单用法。

首先通过NuGet添加 Microsoft.Extensions.Hosting、Microsoft.Extensions.Caching.Memory 这两个包。

添加命令:

Install-Package Microsoft.Extensions.Caching.Memory
Install-Package Microsoft.Extensions.Hosting

向缓存中添加数据:

memoryCache.Set(dog.Name, dog, options);

从缓存获取数据(可以直接使用泛型方法指定返回类型):

memoryCache.Get<Dog>(key);

添加时可以使用 await memoryCache.GetOrCreateAsync()方法完成,该方法可以在缓存中没有数据时另外处理获取数据的方式,并将结果添加进缓存中。

一、示例代码

internal class CacheDemo
{
//该集合当做数据源
static IEnumerable<Dog> dogs;
//全局容器
static IHost host;
public static async Task DemoMain()
{
//向容器添加缓存服务
host = Host.CreateDefaultBuilder()
.ConfigureServices(services => services.AddMemoryCache())
.Build(); //向数据源填充数据
dogs = GetDogs().ToList();
//缓存配置
MemoryCacheEntryOptions cacheOptions = new()
{
//设置缓存10秒过期
AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10)
}; //循环查询缓存中是否有对应数据
foreach (Dog dog in GetDogs())
{
var dogResult = await GetDogAsync(dog.Name);
Console.WriteLine($"查询结果1:{dogResult}");
} var dogResult2 = GetCacheData("泰迪");
Console.WriteLine($"查询结果2:{dogResult2}");
Console.WriteLine("等待11秒缓存过期后再获取");
await Task.Delay(11000);
var dogResult3 = GetCacheData("泰迪");
Console.WriteLine($"查询结果3:{dogResult3}");
//向缓存中添加泰迪
SetCacheData(new Dog("泰迪", 1), cacheOptions);
var dogResult4 = GetCacheData("泰迪");
Console.WriteLine($"查询结果4:{dogResult4}");
var dogResult5 = GetCacheData("吉娃娃");
Console.WriteLine($"查询结果5:{dogResult5}");
} /// <summary>
/// 从缓存中获取数据
/// 如果没有则从数据源获取并添加至缓存
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private static async Task<Dog> GetDogAsync(string name)
{
//从容器中获取缓存服务
IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();
//查询缓存数据,没有则从数据源查询并添加至缓存
var dogResult = await memoryCache.GetOrCreateAsync(name, t =>
{
t.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10);
Console.WriteLine($"缓存中没有{name},查询集合数据!");
Dog dog1 = dogs.SingleOrDefault(d => d.Name.Equals(name));
return Task.FromResult(dog1);
});
return dogResult;
} /// <summary>
/// 向缓存中添加数据
/// </summary>
/// <param name="dog"></param>
/// <param name="options"></param>
private static void SetCacheData(Dog dog, MemoryCacheEntryOptions options)
{
//从容器中获取缓存服务
IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();
memoryCache.Set(dog.Name, dog, options);
} /// <summary>
/// 缓存中获取数据
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private static Dog GetCacheData(string key)
{
//从容器中获取缓存服务
IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();
return memoryCache.Get<Dog>(key);
} /// <summary>
/// 获取所有可爱的狗
/// </summary>
/// <returns></returns>
private static IEnumerable<Dog> GetDogs()
{
yield return new Dog("泰迪", 1);
yield return new Dog("吉娃娃", 2);
yield return new Dog("哈士奇", 3);
yield return new Dog("罗威纳", 4);
}
}
/// <summary>
/// 狗类
/// </summary>
/// <param name="Name"></param>
/// <param name="Id"></param>
internal record Dog(string Name, int Id);

输出结果:

缓存中没有泰迪,查询集合数据!
查询结果1:Dog { Name = 泰迪, Id=1 }
缓存中没有吉娃娃,查询集合数据!
香询结果1:Dog { Name = 告娃娃, Id=2 }
缓存中没有哈士奇,查询集合数据!
查询结果1:Dog { Name = 哈士奇, Id=3 }
缓存中没有罗威纳,查询集合数据!
香询结果1:Dog { Name = 罗威纳, Id=4 }
查询结果2:Dog { Name = 泰迪, Id=1 }
等待11秒缓存过期后再获取
查询结果3:
查询结果4:Dog { Name = 泰迪, Id=1 }
查询结果5:

二、常见问题

1、缓存雪崩

是指同一时间大量缓存失效, 导致大量请求发向后端服务。向缓存添加数据时,时间可以设置一定范围的随机时间,这是一种避免出现缓存雪崩的简单方法。

2、缓存击穿

是指热点缓存失效,导致查询该热点数据的请求大量查询后端服务。如果业务场景允许,可以每次延长缓存时间或者设置为不过期。也可以使用单独的任务来维护热点数据缓存。

3、缓存穿透

是指大量不存在的数据请求(比如恶意请求)进行查询,此时缓存和后端服务中都没有这些数据,浪费大量资源。这个时候使用布隆过滤器是个很好的选择。

.Net Core MemoryCache 缓存的更多相关文章

  1. .NET Core MemoryCache缓存获取全部缓存键

    在Core中不能使用原HttpRuntime.Cache缓存,改为MemoryCache(Microsoft.Extensions.Caching.Memory). 现MemoryCache新版为2. ...

  2. 拥抱.NET Core系列:MemoryCache 缓存选项

    在上一篇 "拥抱.NET Core系列:MemoryCache 缓存过期" 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介 ...

  3. 拥抱.NET Core系列:MemoryCache 缓存域

    在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...

  4. 拥抱.NET Core系列:MemoryCache 缓存域(转载)

    阅读目录 MSCache项目 缓存域 写在最后 在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MS ...

  5. 拥抱.NET Core系列:MemoryCache 缓存选项 (转载)

    阅读目录 MSCache项目 MemoryCacheOptions ExpirationScanFrequency SizeLimit CompactionPercentage 写在最后 在上一篇 ” ...

  6. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  7. 讨论过后而引发对EF 6.x和EF Core查询缓存的思考

    前言 最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中,之前从未接触过是个高大上的东东跟着老大学习中,其中收获不少,本打算再看看RabbitMQ有时间写写,回来后和何镇汐大哥探讨 ...

  8. MemoryCache缓存 ---缓存时效

    MemoryCache缓存 ---缓存时效测试 var cachePool = new MyCachePool(); //Thread.Sleep(1000); var value = cachePo ...

  9. 拥抱.NET Core系列:MemoryCache 缓存过期

    在上一篇"拥抱.NET Core系列:MemoryCache 初识"中我们基本了解了缓存的添加.删除.获取,那么今天我们来看看缓存的过期机制.这里和上篇一样将把"Micr ...

  10. .NET Core 的缓存篇之MemoryCache

    前言 对于缓存我们都已经很熟悉了,缓存分为很多种,浏览器缓存.试图缓存.服务器缓存.数据库缓存等等一些,那今天我们先介绍一下视图缓存和MemoryCache内存缓存的概念和用法: 视图缓存 在老的版本 ...

随机推荐

  1. MLP实现minist数据集分类任务

    1. 数据集 minist手写体数字数据集 2. 代码 ''' Description: Author: zhangyh Date: 2024-05-04 15:21:49 LastEditTime: ...

  2. Qt-ui的简单使用,常用控件(2)

    1  简介 本文主要介绍Qt ui界面的简单使用,介绍一些常用的控件. 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=22 2  常用控件 常用 ...

  3. react 过渡动画组件

    在项目中可能会有一些动画效果展示或是页面切换效果,css动画的方式,比较局限,涉及到一些js动画的时候没法处理了.react-transition-group是react的第三方模块,借住这个模块可以 ...

  4. kettle从入门到精通 第四十八课 ETL之kettle webspoon

    1.kettle自带的客户端spoon工具是cs架构,多人协同办公起来不是特别方便.当然spoon也可以通过文件仓库设置为database模式进行协同办公.每个人在自己电脑上安装&打开spoo ...

  5. 使用 INFINI Console 实现 Elasticsearch 的增量数据迁移

    功能介绍 # 在 INFINI Console 1.3.0 版本里,数据迁移功能增加了对增量迁移的支持.这篇文章将会介绍增量迁移的具体使用方法和实现原理. 场景介绍 # 以常见的日志场景为例,假设 A ...

  6. 设置双击ps1脚本直接用Powershell打开

    设置双击ps1脚本直接用Powershell打开. 默认.ps1 文件双击是不能打开的,只能右键运行. 解决方法: 1.按windows+R打开运行,输入regedit,打开注册表 2.找到HKEY_ ...

  7. Opencompass笔记整理

    Smiling & Weeping ---- 山海自有归期,风雨自有相逢 大模型评测教程 随着人工智能技术的快速发展, 大规模预训练自然语言模型成为了研究热点和关注焦点.OpenAI于2018 ...

  8. JavaScript:JS对象_Array

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  9. Ansible的常用模块

    目录 ansible常用模块 1. file模块 1.1 file模块的选项 1.2 file模块的使用 1.2.1 使用file模块在远程主机创建文件 1.2.2 创建目录 1.2.3 删除文件/目 ...

  10. 行为型模式(Behavioer Pattern)

    行为型设计模式 行为型模式定义了系统中对象之间的交互与通信,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责,包括对系统中较为复杂的流程的控制. 在软件系统运行时对象并不是孤立存在的,它 ...