首页 > 数据库 >.NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)

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

时间:2024-05-15 09:08:39浏览次数:25  
标签:缓存 memoryCache IDistributedCache Redis value cacheKey public op

.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 等

 

2024-05-15 09:02:03【出处】:https://www.cnblogs.com/WinterSir/p/17701841.html

=======================================================================================

标签:缓存,memoryCache,IDistributedCache,Redis,value,cacheKey,public,op
From: https://www.cnblogs.com/mq0036/p/18192678

相关文章

  • RediSearch的简单使用与总结
    前言之前就有考虑过想要研究下RediSearch,号称高性能全文索引的功能,这几天闲来无事调研了一番。RediSearch介绍RediSearch是RedisLabs提供的一款强大且高效的搜索和全文索引引擎。它是一个基于Redis的模块,允许用户在Redis数据库中进行复杂的搜索和全文检索操作,而无需将......
  • 影响Redis的因素
    两个重要概念Redis提供了两种不同的持久化机制来保证数据的持久存储:RDB(RedisDatabase)和AOF(AppendOnlyFile)。RDB持久化RDB持久化是通过创建数据集的快照(snapshot)来工作的。在指定的时间间隔内,Redis会创建一个数据集的内存镜像,并将它写入一个磁盘上的文件中(通常是一个.r......
  • 2.Redis安装
    Redis安装Windows下安装下载地址:https://github.com/tporadowski/redis/releasesRedis支持32位和64位。这个需要根据你系统平台的实际情况选择,这里我们下载Redis-x64-xxx.zip压缩包到C盘。打开文件夹,内容如下:打开redis.windows.conf文件ctrl+f搜索maxmemory......
  • 1.Redis简介
    Redis简介Redis(RemoteDictionaryServer)是一个开源的内存数据库,遵守BSD协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。性能极高:Redis以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发请求......
  • 2.集成MySQL及Redis
    连接MySQL将刚才复制的代码放在app创建后并运行文件根据警告提示复制内容根据SQLAlchemy()中的__init__()中的init_app()也可以得知没有以上内容将会警告,所以得注意代码顺序连接Redis为方便后期更换我们和Mysql一样将配置信息写入配置类通过类属性的方法使用......
  • Centos7下Prometheus+Grafana部署 redis 以及 mysql 监控
    Prometheus部署mysql监控本篇文章部分内容与我前一篇文章衔接,看不明白的可以参考我前一篇文章Centos7下搭建Prometheus+Grafana并部署基础监控Redis监控对于Redis的监控,Prometheus可以收集多种指标,包括但不限于:命令统计:如每个命令的调用次数、执行时间等。内存使用情......
  • 使用Redis执行多个命令
    单个命令执行packagemainimport("context""fmt""github.com/go-redis/redis/v8""time")funcmain(){//创建Redis客户端rdb:=redis.NewClient(&redis.Options{Addr:"localhos......
  • redis学习笔记3: redis常用命令
    redis学习笔记3:redis常用命令在此处输入redis命令字符串操作命令setkeyvalue设置指定key的值(类似于put)getkey获取指定key的值setexkeysecondsvalue设置带有过期时间的keysetnxkey......
  • redis学习笔记4: 在Java中操作Redis
    redis学习笔记4:在Java中操作RedisRedis的Java客户端Jedis[命令和原生Redis基本相同]Lettuce[性能高效]SpringDateRedis[可以在Spring项目中使用,简化操作]SpringDateRedis使用方式导入maven坐标<!--https://mvnrepository.com/artifact/org.springfra......
  • day4-1-Redis
    day4-1-Redis入门Redis介绍Redis是一个基于内存的key-value结构数据库基于内存存储,读写性能高适合存储热点数据(热点商品,咨询,新闻)(在特定时间有大量访问量)keyvalueid101name小智city北京redis中文网Redis安装Redis启动-服务端......