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

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

时间:2024-05-09 22:01:27浏览次数:24  
标签:缓存 IDistributedCache Redis value cacheKey public op

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

 

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

测试签名   分类: Redis

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

相关文章

  • Redis随手笔记
    1内存(RAM)和磁盘(如HDD或SSD)的读写速度差异内存(RAM)和磁盘(如HDD或SSD)的读写速度差异很大,这是因为它们基于完全不同的技术和物理原理。内存的访问速度远快于磁盘。内存(RAM):数据是直接在CPU可以快速访问的内存芯片上进行读写的。内存访问的延迟通常在几十纳秒(ns)范围内,数据传输速率......
  • redis三主三从集群快速搭建
    redis集群快速搭建 1本文以redis6.2.6版本为例,快速搭建一套三主三从的redis集群,已经提前将脚本写好,只需要在节点上面进行执行即可安装#!/bin/bashinstall_redis(){#解压Redis源码包tar-zxvfredis-6.2.6.tar.gz......
  • 记一次线上Redis内存占用过高、大Key问题的排查
    问题背景在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量。稍加思索,应该是某些Key的Value数据体量过大,占用了过多的内存空间,我们在使用Redis的过程中,单个Value或者单个集合中的元素应该保证不超过10KB,......
  • redis、LVS、nginx的基本使用方法
    redis、LVS、nginxredis搭建哨兵原理哨兵搭建至少要有3个机器,且必须为奇数个redis搭建哨兵之前要先实现主从复制;master的配置文件中的masterauth和slave都必须相同实现主从复制之所有从节点配置文件[root@slave~]#yuminstall-yredis[root@slave~]#vim/etc/redis.c......
  • Redis热点key大key
    一、热点key问题  1、商品秒杀、热点新闻、热点评论等读多写少的场景,可能会造成一个较大的请求Redis量,这种情况下就会造成热点Key问题。  2、请求分片集中,超过单台Redis服务器的性能极限。    手动分片或者custer分片切分,刚好一致性hash落入同一台redis服务器,数据倾......
  • Redis的监控指标
    一、内存使用情况  redis-cliinfo#memory1、总内存使用量(80%)。used_memory实际使用内存  used_memory_peak峰值,used_memory_rss系统分配给redis的总内存大小,包含内存碎片。2、内存碎片。mem_fragmentation_ratio=used_memory_rss/used_memory    <1表示Redi......
  • 5个.Net版本 Redis 客户端开源库
    Redis作为一个高性能(NOSQL)的key-value数据库,在实际项目开发中运用非常广泛,也适用于很多业务场景。下面介绍5个.Net版本Redis客户端开源库,方便开发和提升效率。1、StackExchange.Redis简介:由StackExchange团队开发。它提供了丰富的功能和选项,如连接池、管道、事务、发布/订阅......
  • redis的订阅与发布
    1.订阅的关系维护redis的所有频道的订阅关系都维护在pubsub_channels字典里面,这个字典的key是被订阅的频道,而value是订阅客户端的链表。structredisServer{//...//保存所有订阅关系dict*pubsub_channels;//...}字典示例:与此类似,服务器也将......
  • docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群
    docker搭建redis集群(三主三从)及重启redis集群一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤:dockerpullredis:6.0.82、查看本地拉取到镜像文件dockerimages 看到图上标识,就说明当前镜像文件已......
  • Redis
    redis是什么?为什么使用?基于内存的,k,v形式非关系型数据库,单机可支持十万tps。为什么使用?解决并发、性能问题,弥补关系型数据库的不足。redis的特点?1.高可用架构2.高性能3.支持持久化4.支持多种数据结构5.支持pub/sub消息模式6.支持多种语言7.原子操作,所有操作都是原子操作,......