.NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)

net,imemorycache,idistributedcache,redis · 浏览次数 : 0

小编点评

**.NET缓存类介绍** .NET提供以下几种类型的缓存对象: * **内存缓存**:在应用程序运行期间创建并存储在内存中的缓存。 * **分布式缓存**:在多个节点上创建并存储在分布式缓存中的缓存。 * **内存缓存 IMemoryCache1**:与内存缓存类似,但使用IMemoryCache接口的缓存对象。 * **Program注入缓存builder.Services.AddMemoryCache()**:使用程序注入的方式创建和配置内存缓存。 **主要方法及参数** **内存缓存** * **Get():**获取缓存中的值,如果缓存中没有该值,则返回“null”。 * **TryGetValue():**尝试获取缓存中的值,如果存在,返回该值。 * **GetOrCreate():**如果缓存中没有该值,则创建并返回该值。 * **GetOrCreateAsync():**获取缓存中的值,并异步执行操作。 * **Set():**设置缓存中的值。 * **Remove():**移除缓存中的值。 **分布式缓存** * **Get():**获取缓存中的值。 * **GetAsync():**获取缓存中的值,并异步执行操作。 * **Set():**设置缓存中的值。 * **Remove():**移除缓存中的值。 * **Refresh():**刷新缓存中的所有值。 * **RefreshAsync():**刷新缓存中的所有值,并异步执行操作。 **拓展方法** * **GetString()、GetStringAsync():**通过 byte[]字节数组获取和设置缓存中的值。 * **SetString()、SetStringAsync():**通过 byte[]字节数组设置和获取缓存中的值。 * **SetAsync()、SetAsync():**使用异步方式设置和获取缓存中的值。 **关键参数** * **过期时间:**用于内存缓存和分布式缓存的缓存项失效时间。 * **Hash值:**用于分布式缓存的键的哈希函数。

正文

.NET缓存里分了几类,主要学习内存缓存、分布式缓存

一、内存缓存 IMemoryCache

1、Program注入缓存
builder.Services.AddMemoryCache();
2、相关方法及参数

Get、TryGetValue、GetOrCreate、GetOrCreateAsync、Set、Remove,关键参数是过期时间,GetOrCreate、GetOrCreateAsync是通过委托类型的参数设置的,Set方法可以通过参数直接设置,或者使用MemoryCacheEntryOptions,类型有三种:
(1)AbsoluteExpiration 绝对过期,到期删除
(2)AbsoluteExpirationRelativeToNow 相对当前时间过期,到期删除
(3)SlidingExpiration 滑动过期,时效内访问再延长,未访问到期删除

[Route("api/[controller]/[action]")]
[ApiController]
public class MemoryCacheController : ControllerBase
{
    private readonly IMemoryCache _memoryCache;
    private readonly string cacheKey = "cache";
    public MemoryCacheController(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }

    [HttpGet]
    public string Get()
    {
        var value = _memoryCache.Get(cacheKey);
        return value == null ? "null" : value.ToString();
    }

    [HttpGet]
    public string TryGetValue()
    {
        if (_memoryCache.TryGetValue(cacheKey, out string value))
            return value;
        return "null";
    }

    [HttpGet]
    public string GetOrCreate()
    {
        var value = _memoryCache.GetOrCreate(
            cacheKey,
            cacheEntry =>
             {
                 cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3);
                 return "GetOrCreate:" + DateTime.Now.ToString("T");
             });
        return value;
    }

    [HttpGet]
    public async Task<string> GetOrCreateAsync()
    {
        var value = await _memoryCache.GetOrCreateAsync(
            cacheKey,
            cacheEntry =>
            {
                cacheEntry.SlidingExpiration = TimeSpan.FromSeconds(3);
                return Task.FromResult("GetOrCreateAsync:" + DateTime.Now.ToString("T"));
            });
        return value;
    }

    [HttpPost]
    public void Set()
    {
        string value = "Set:" + DateTime.Now.ToString("T");

        MemoryCacheEntryOptions op = new MemoryCacheEntryOptions();

        //绝对到期,到期删除
        op.AbsoluteExpiration = DateTimeOffset.Parse("2023-12-31 23:59:59");
        //_memoryCache.Set(cacheKey, value, DateTimeOffset.Parse("2023-12-31 23:59:59"));

        //相对当前时间过期,到期删除
        op.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10);
        //_memoryCache.Set(cacheKey, value, TimeSpan.FromSeconds(10));

        //滑动过期,时效内访问再延长,未访问到期删除
        op.SlidingExpiration = TimeSpan.FromSeconds(10);

        _memoryCache.Set(cacheKey, value, op);
    }

    [HttpDelete]
    public void Remove()
    {
        _memoryCache.Remove(cacheKey);
    }
}

二、分布式缓存 IDistributedCache

工欲善其事,必先利其器——>Redis安装

1、Program注入缓存

(1)先安装Nuget:Microsoft.Extensions.Caching.StackExchangeRedis
(2)appsettings.json配置Redis连接

"Redis": "39.107.109.17:6379,password=shenhuak1"

(3)Program注入

//Redis分布式缓存
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = builder.Configuration["Redis"];
    options.InstanceName = "RedisInstance";//实例名,配置后实际的key=InstanceName+key
});
2、相关方法及参数

IDistributedCache 接口提供方法:Get、GetAsync、Set、SetAsync、Refresh、RefreshAsync、Remove、RemoveAsync
以及拓展方法:GetString、GetStringAsync、SetString、SetStringAsync
过期参数跟内存缓存差不多,直接看代码

[Route("api/[controller]/[action]")]
[ApiController]
public class DistributedController : ControllerBase
{
    private readonly IDistributedCache _distributedCache;
    private readonly string cacheKey = "cache";
    public DistributedController(IDistributedCache distributedCache)
    {
        _distributedCache = distributedCache;
    }

    [HttpGet]
    public string Get()
    {
        return _distributedCache.GetString(cacheKey);
    }

    [HttpGet]
    public async Task<string> GetAsync()
    {
        return await _distributedCache.GetStringAsync(cacheKey);
    }

    [HttpPost]
    public void Set()
    {
        DistributedCacheEntryOptions op = new DistributedCacheEntryOptions();

        //绝对过期,到期删除
        op.AbsoluteExpiration = DateTimeOffset.Parse("2023-12-31 23:59:59");//op.SetAbsoluteExpiration(DateTimeOffset.Parse("2023-12-31 23:59:59"));

        //相对当前时间过期,到期删除
        op.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10);//op.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));

        //滑动过期,时效内访问再延长,未访问到期删除
        op.SlidingExpiration = TimeSpan.FromSeconds(10);//op.SetSlidingExpiration(TimeSpan.FromSeconds(10));

        _distributedCache.SetString(cacheKey, DateTime.Now.ToString("T"), op);
    }

    [HttpPost]
    public async Task SetAsync()
    {
        await _distributedCache.SetStringAsync(cacheKey, DateTime.Now.ToString("T"));
    }

    [HttpPost]
    public void Refresh()
    {
        _distributedCache.Refresh(cacheKey);
    }

    [HttpPost]
    public async Task RefreshAsync()
    {
        await _distributedCache.RefreshAsync(cacheKey);
    }

    [HttpDelete]
    public void Remove()
    {
        _distributedCache.Remove(cacheKey);
    }

    [HttpDelete]
    public async void RemoveAsync()
    {
        await _distributedCache.RemoveAsync(cacheKey);
    }
}
3、总结

非拓展方法是都是通过byte[]字节数组来向Redis存取数据的不方便,大多情况都会自己封装一个helper类。拓展方法虽然用string类型操作,实际存储到Redis是用的Hash类型,无法操作Redis其他类型及功能。
完整功能需要使用其他客户端:StackExchange.Redis、FreeRedis、NRedisStack 等

与.NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)相似的内容:

.NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)

.NET缓存里分了几类,主要学习内存缓存、分布式缓存 一、内存缓存 IMemoryCache 1、Program注入缓存 builder.Services.AddMemoryCache(); 2、相关方法及参数 Get、TryGetValue、GetOrCreate、GetOrCreateAsync

.NET性能优化-使用内存+磁盘混合缓存

我们回顾一下上一篇文章中的内容,有一个朋友问我这样一个问题: > 我的业务依赖一些数据,因为数据库访问慢,我把它放在Redis里面,不过还是太慢了,有什么其它的方案吗? 其实这个问题比较简单的是吧?Redis其实属于网络存储,我对照下面的这个表格,可以很容易的得出结论,既然网络存储的速度慢,那我们就

记一次 .NET 某电子厂OA系统 非托管内存泄露分析

一:背景 1.讲故事 这周有个朋友找到我,说他的程序出现了内存缓慢增长,没有回头的趋势,让我帮忙看下到底怎么回事,据朋友说这个问题已经困扰他快一周了,还是没能找到最终的问题,看样子这个问题比较刁钻,不管怎么说,先祭出 WinDbg。 二:WinDbg 分析 1. 托管还是非托管泄露 一直关注这个系列

.NET周报 【4月第2期 2023-04-08】

国内文章 LRU缓存替换策略及C#实现 https://www.cnblogs.com/eventhorizon/p/17290125.html 这篇文章讲述了缓存替换策略,特别是LRU算法。LRU算法基于这样一个假设:如果数据最近被访问过,那么将来被访问的几率也更高。通常我们会用双向链表来实现这个

Garnet:微软官方基于.NET开源的高性能分布式缓存存储数据库

前言 前不久Redis宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSALv2 和 SSPLv1 协议,该协议变化意味着Redis不再开源。今天给大家分享一款完全开源(MIT协议)、免费的Redis替代性项目产品:Garnet。 Redis开源协议详情:https

Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验

Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念。这包括服务、缓存、工作流、复原能力、机密管理等之间的安全同步和异步通信。不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业务功能。在您的时间有限并且您只想进行实验的情况下,在Dapr初始设置上花费大量时间可能会令人沮丧。更

01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明

## 中台框架后端项目 Admin.Core 的介绍与配置说明 > 中台admin是前后端分离权限管理系统,Admin.Core为后端项目,基于.NET 7.0开发。 > 支持多租户、数据权限、动态 Api、任务调度、OSS 文件上传、滑块拼图验证、多数据库,分布式缓存、分布式事务等 - 接口文档一

缓解项目压力,畅享生活

在一个紧张的 .NET 项目中,压力时刻伴随着我们。为了缓解这种压力,我们需要适当放松,给自己一些喘息的时间。周末的到来,为我们提供了一个出游的机会,让我们期待着一个晴朗温暖的天气,一起出去遛娃,享受一下生活。 我们决定前往一个美丽的温泉度假村,避开高峰期,减少交通拥堵。在路上,孩子们兴奋不已,他们

[转帖]IO、NIO、BIO 傻傻分不清吗,让我对象告诉你~~

https://my.oschina.net/jiagoushi/blog/5783304 1、Stream 与 Channel stream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层) stream 仅支持阻塞 API,channel 同时支持阻塞、非阻塞

从 Pulsar Client 的原理到它的监控面板

![image.png](https://s2.loli.net/2023/08/02/GipDPSlbycQxqFd.png) # 背景 前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。 虽然我们有个监控页面可以根据 topic 维度查