首页 > 其他分享 >.NET 缓存

.NET 缓存

时间:2024-07-01 11:58:01浏览次数:1  
标签:缓存 过期 serviceProvider cache NET public 分布式

原文链接:https://blog.csdn.net/dabusidede/article/details/124858045

内存缓存包:

Microsoft.Extensions.Caching.Memory

1.注册内存缓存

services.AddMemoryCache();

2.基本使用示例

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    private readonly IServiceProvider _serviceProvider;

    public Worker(ILogger<Worker> logger, IServiceProvider serviceProvider)
    {
        _logger = logger;
        _serviceProvider = serviceProvider;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine(Get());
            await Task.Delay(1000, stoppingToken);
        }
    }

    public string Get()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();

        // 从缓存中获取键为 key1 的项,如果没有或过期,则调用第二个参数Fun生成
        return cache.GetOrCreate<string>("key1", cacheEntity => {
            // 设置过期时间,过期后会重新调用该函数生成值
            // 设置过期时间
            // 如果5秒内没有访问该值,则过期
            // 否则,过期时间刷新为访问的时间 +5 秒
            cacheEntity.SlidingExpiration = TimeSpan.FromSeconds(5);

            // 设置绝对过期时间
            // 过期时间为15秒后,无论这15秒内是否有访问都会过期
            cacheEntity.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(15);

            // 设置该项优先级
            // NeverRemove 为不会从缓存中移除,除非过期
            // 优先级越低,内存不足时,将会移除该项
            cacheEntity.SetPriority(CacheItemPriority.NeverRemove);

            // 注册缓存项从缓存移除时的回调函数
            cacheEntity.RegisterPostEvictionCallback(
                (object key, object value, EvictionReason reason, object state) => { });

            return DateTime.Now.ToString();
        });
    }

    public void Remove()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();

        // 从缓存中移除键为key1的缓存项
        cache.Remove("key1");
    }
}

  3.内存缓存与EFCore
EFCore也使用内存缓存,如果我们使用依赖注入注入IMemoryCache ,则注入的可能是EFCore使用的缓存,所以最好的方法是我们重新注入我们的缓存(单例)

public class IEMemoryCache : MemoryCache, IIEMemoryCache
{
    public IEMemoryCache() : base(new MemoryCacheOptions {
        SizeLimit = null
    })
    {
    }
}

  分布式缓存

1.使用示例

public string Get()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();

    // 获取键为 mykey1 的缓存项
    string value = cache.GetString("mykey1");
    if (string.IsNullOrEmpty(value))
    {
        // 设置键为 mykey1 的缓存项
        cache.SetString("mykey1", "abc");
        return "no value";
    }
    
    return value;
}

public void Remove()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();
    // 从缓存中移除键为mykey1的缓存项
    cache.Remove("mykey1");
}

  2.注册分布式缓存
目前有很多种分布式缓存可以注册
1)内存分布式缓存
内存分布式缓存其使用内存作为缓存,单其却实现了分布式缓存的接口

services.AddDistributedMemoryCache();

  2)redis分布式缓存

services.AddStackExchangeRedisCache (options => {
    // 配置 Redis 连接字符串
    // 127.0.0.1:6379 为 Redis 服务地址,123456 为 Redis 连接密码
    options.Configuration = "127.0.0.1:6379,password=123456";
    // 随便起的实例名,我们在 Redis 服务器保存的 key 均以该实例名开头
    options.InstanceName = "SampleInstance";
});

  

标签:缓存,过期,serviceProvider,cache,NET,public,分布式
From: https://www.cnblogs.com/Dongmy/p/18277777

相关文章

  • 解决.NET Core Ajax请求后台传送参数过大请求失败问题
    原文链接:https://www.cnblogs.com/xiongze520/p/14500156.html今天在项目上遇到一个坑,在.NetCore中通过ajax向mvc的controller传递对象时,控制器(controller)的方法一直没有进去,百思不得其解,后面把传递的参数打印出来发现传递的参数比较大,有2.4M的数据,如下图:后面跟踪项目发现we......
  • 使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
    原文链接:https://blog.csdn.net/zls365365/article/details/124162096前言以前.NetCore是不内置JSON库的,所以大家都用Newtonsoft的JSON库,而且也确实挺好用的,不过既然官方出了标准库,那更方便更值得我们多用用,至少不用每次都nuget安装Newtonsoft.Json库了。字符编码问题默认的S......
  • CentOS 7报错Erro:NetworkManager is not running怎么处理?
    CentOS7系统报错Error:NetworkManagerisnotrunning,意思是NetworkManager未在运行,NetworkManager是Linux系统上管理网络设置的守护进程,负责自动处理和配置网络连接,未运行可能会导致网络连接问题。遇到报错Error:NetworkManagerisnotrunning我们该如何处理呢?今天飞飞和你分......
  • WPF在.NET9中的重大更新:Windows 11 主题
    在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论。对三个事项发起了投票。第一个是Windows11主题第二个是更新的控件第三个是可空性注释最终Windows11主题得票最高,WPF团队2023-2024的工作优先级就是Windows11主题了。WPF控件的外观多年来一......
  • .Net各大平台与其对应的C#语法版本
    前言: .NET平台与C#语法版本之间有着紧密的对应关系。以下是各个.NET平台版本与它们对应的C#语法版本的详细概述:.NETFramework.NETFramework1.0-C#1.0.NETFramework1.1-C#1.1.NETFramework2.0-C#2.0.NETFramework3.0,3.5-C#3.0.NETFramework4.0......
  • C#/.NET/.NET Core优秀项目和框架2024年6月简报
    前言公众号每月定期推广和分享的C#/.NET/.NETCore优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码......
  • 初识Kubernetes
    前言:Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。以下是从入门到精通Kubernetes的详细指南:一、Kubernetes基础概述Kubernetes由Google开源,旨在自动化容器的部署、扩展和管理。它提供了一个平台,用于运行分布式系统,具有出色......
  • Paper Reading: Genetic programming for multiple-feature construction on high-dim
    目录研究动机文章贡献预备知识本文方法MCIFC:一种多类无关的特征构建方法CDFC:一种多类相关特征构建方法实验结果数据集和实验设置多特征构造与单特征构造对比多树GP对比单树GPfilter对比混合方法类依赖对比类独立非GP对比基于GP的特征构建优点和创新点PaperReading是从......
  • CXL:拯救NVMe SSD缓存不足设计难题-2
    LMB提出了基于CXL协议的内存扩展框架和内核模块。该方案利用CXL内存扩展器作为物理DRAM源,旨在提供一个统一的内存分配接口,使PCIe和CXL设备都能方便地访问扩展的内存资源。通过这个接口,NVMe驱动和CUDA的统一内存内核驱动可以直接高效地访问CXL内存扩展器,让SSD和GPU设备能够像使......
  • mybatis一级缓存、二级缓存的原理
    MyBatis的缓存机制分为两个级别:一级缓存和二级缓存。这两种缓存机制都有助于提高数据访问效率,减少对数据库的直接请求次数,但它们的工作原理和适用场景有所不同。一级缓存(Per-ExecutorTransactionalCaches)一级缓存也被称为“事务范围内的缓存”或者“执行器级别的缓存”。它是......