首页 > 其他分享 >.Net Core Console&Cache

.Net Core Console&Cache

时间:2023-04-30 09:55:19浏览次数:40  
标签:Core 缓存 Console WriteLine 过期 Cache cache key Net

前言

有时候想快速验证一些想法,新建一个控制台来弄,可控制台模板是轻量级的应用程序模板,不具备配置、日志、依赖注入等一些功能。


缓存

在网站开发中,缓存无处不在,它能够极大地提高硬件和软件的运行速度。性能优化的第一步便是使用缓存,例如频繁的从数据库中读取,需要和底层IO交互,性能受限,如将常用数据加载到内存中,那么便可以极大的提升性能。


Nuget包

缓存抽象包

Install-Package Microsoft.Extensions.Caching.Abstractions

如使用内存做缓存

Install-Package Microsoft.Extensions.Caching.Memory

如使用Redis做缓存

Install-Package Microsoft.Extensions.Caching.Redis

还有其他一些缓存包,此处省略


缓存使用

新建控制台项目,此处使用Memory包,简单存取一个字符串到内存中。

using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddMemoryCache();
    })
    .Build();

using (var serviceScope = host.Services.CreateScope())
{
    var services = serviceScope.ServiceProvider;
    var cache = services.GetRequiredService<IMemoryCache>();
    cache.Set("key", "value");

    Console.WriteLine(cache.Get("key"));
}

如上使用了通用主机包 Microsoft.Extensions.Hosting


过期策略

除了纯设置key-value值外还可以设置缓存的有效期,存在四种设置策略。

  • 永不过期
  • 绝对过期:指定过期时长再访问就失效。
  • 滑动过期:指定过期时长内访问,过期时常最终截止时间延长。
  • 绝对+滑动过期:滑动过期基础上再设置绝对过期,避免无限延长。

滑动过期

可通过MemoryCacheEntryOptions来设置过期策略,此处设置1.5秒滑动过期。

cache.Set("key", "value", new MemoryCacheEntryOptions()
{
    SlidingExpiration = TimeSpan.FromSeconds(1.5)
});
Console.WriteLine($"{DateTime.Now:HHmmss}_Init_{cache.Get("key")}");
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now:HHmmss}_First_{cache.Get("key")}");
Thread.Sleep(2000);
Console.WriteLine($"{DateTime.Now:HHmmss}_Second_{cache.Get("key")}");

在1秒后访问,过期时长延长,sleep2秒后再次访问则失效。
图片


缓存回调

在缓存失效时还可以执行些回调逻辑。

var options = new MemoryCacheEntryOptions()
{
    SlidingExpiration = TimeSpan.FromSeconds(1.5),
};
options.RegisterPostEvictionCallback((key, value, reason, state) =>
{
    Console.WriteLine("key=" + key);
    Console.WriteLine("value=" + value);
    Console.WriteLine("reason=" + reason);
    Console.WriteLine("state=" + state);
}, "statestr");

当超过缓存时长,执行回调逻辑,此处将key value输出,可以看到尽管缓存失效获取对应值为空了,但是缓存回调中还是有值的展示,在这可以做些处理,例如如果是特定值,可以再次加入到缓存中。
图片

PostEvictionCallback可以绑定多个回调方法,注意每个回调方法在失效后只会执行一次,多次访问缓存key,当扫描到失效后执行回调,后续访问缓存key都不会获取到缓存实例了。


源码分析

IMemoryCache源码中定义了三个方法对应增删查操作。

图片

在这基础上还有一些扩展方法在Caching.Abstraction包中。

图片

IMemoryCache具体实现中,最终是存储在字典中,源码位置

图片

存储的实际对象是CacheEntry,在MemoryCache中,将自身与key作为参数封装到CacheEntry中

图片

对于缓存的一些设置,如缓存项大小,缓存有效期,访问时扫描时间,缓存失效回调等,则通过MemoryCacheOptions完成,可以在单个缓存项设置也可以在全局服务注册时设置好。

图片


参考

https://learn.microsoft.com/zh-cn/dotnet/core/extensions/caching


2023-04-30,望技术有成后能回来看见自己的脚步

标签:Core,缓存,Console,WriteLine,过期,Cache,cache,key,Net
From: https://www.cnblogs.com/CKExp/p/17364932.html

相关文章

  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
    在前两篇:.NETCore部署到linux(CentOS)最全解决方案,常规篇.NETCore部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.netcore应用。......
  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
    在前两篇:.NETCore部署到linux(CentOS)最全解决方案,常规篇.NETCore部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.netcore应用。......
  • .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
    在前两篇:.NETCore部署到linux(CentOS)最全解决方案,常规篇.NETCore部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)我们对.netcore部署到linux有了一个充分的了解,已经可以满足应用要求了,这篇文章我们继续深入带你了解使用Doker+jexus或Nginx来部署.netcore应用。......
  • Kubernetes(K8S) kubesphere 介绍
    使用Kubeadm部署Kubernetes(K8S)安装--附K8S架构图Kubernetes(K8S)kubesphere安装官网地址:https://kubesphere.com.cn/KubeSphere是个全栈的Kubernetes容器云PaaS解决方案KubeSphere是在目前主流容器调度平台Kubernetes之上构建的企业级分布式多租户容器平台,提供简单易......
  • ASP.NET Core User Secret & Azure Key Vault
    前言以前就写过很多篇了ASP.NETCore–Configuration&OptionsAsp.netcore学习笔记(Azurekey-vault)Asp.netcore学习笔记Secret和DataProtectAzurekey-vault&StorageAccount第2篇Azure入门系列(第四篇KeyVault)这篇作为最新最完整的版本呗. ......
  • 【愚公系列】2023年04月 .NET CORE工具案例-YARP反向代理
    (文章目录)前言1.YARP是什么YARP(YetAnotherReverseProxy)是一个轻量级的.NET反向代理。它支持HTTP和HTTPS协议,可以将请求转发到其他服务器上。YARP可以用于许多用途,包括加载平衡、内部网络隔离、隐藏内部服务器的IP地址等。它支持使用规则来转发请求,并且可以在......
  • Kubernetes从入门到精通 集群安装准备工作
    一、准备环境 master01192.168.117.100docker,kubectl,kubeadm,kubeletnode01192.168.117.101docker,kubectl,kubeadm,kubeletnode02192.168.117.102docker,kubectl,kubeadm,kubelet二、环境初始化1检查操作系统的版本#此方式下安装kuber......
  • [2core]加解密算法
    本文主要记录从.netframework迁移到.net6后,加解密算法的跨平台测试,如AES和RSA算法。因为RSA使用了BouncyCastle类库提供的实现,所以并没有遇到什么问题。完成加解密算法跨平台测试,迁移工作算是告一段,也标志着从.netframework迁移.net6工作完毕。迁移工作完毕,表示基于.netframewor......
  • Kubernetes从入门到精通 Kubernetes从介绍
    1第一章kubernetes介绍1.1应用部署方式演变在部署应用程序的方式上,主要经历了三个时代:传统部署:互联网早期,会直接将应用程序部署在物理机上优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响虚拟化部......
  • 基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计
    在AWS-ElastiCache中,Reserved_Cache_Nodes-预留节点,也就类似于EC2与RDS的RI(预留实例),都是为了节省成本而选择预付费用的一种方式,当AWS账号有多个时,如何通过编程的方式批量获取所有账号所有区域Region的RN信息呢我们可以通过awscli的方式,也可以通过AWSSDKforPython(Boto3)的......