.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)的更多相关文章

  1. mybatis中二级缓存整合ehcache实现分布式缓存

    mybatis自带二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存.那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器上,假设现在有 ...

  2. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  3. 分布式缓存之 memcache 实现分布式缓存

    最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可 ...

  4. ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用

    .NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...

  5. .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  6. .net core中的分布式缓存和负载均衡

    通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...

  7. ASP.NET Core - 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  8. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现

    一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性.但是上一专题消息队列是基于内存中队列对象来实现,这样实现有一 ...

  9. 基于redis分布式缓存实现

    Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...

  10. EhCache 分布式缓存/缓存集群

    开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发 ...

随机推荐

  1. 探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

    1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构,不同的数据格式适用于不同的场景.常见的数据格式包括JSON.YAML.XML.CSV等. 数据可视化 | 一个覆盖广泛主题工具的高效在线平 ...

  2. JavaScript二代公民身份证号验证

    身份证号码中的校验码是身份证号码的最后一位,是根据[中华人民共和国国家标准GB 11643-1999]中有关公民身份号码的规定, 根据精密的计算公式计算出来的,公民身份号码是特征组合码,由十七位数字本 ...

  3. Ubuntu20.04 LTS国内源安装指定版本Docker/docker-compose

    1.卸载旧版本Docker #卸载旧版本docker sudo apt-get remove docker docker-engine docker-ce docker.io #清空旧版docker占 ...

  4. ET介绍——浅谈AI框架

    AI框架 1. 几种AI的设计 AI在游戏中很多,但是为什么大家总是感觉ai编写起来十分困难,我后来思考了一番,主要原因是使用的方法不当.之前大家编写ai主要有几种方案: a. 状态机 我是不知道谁想 ...

  5. C++ 异常和错误处理机制:如何使您的程序更加稳定和可靠

    在C++编程中,异常处理和错误处理机制是非常重要的.它们可以帮助程序员有效地处理运行时错误和异常情况.本文将介绍C++中的异常处理和错误处理机制. 什么是异常处理? 异常处理是指在程序执行过程中发生异 ...

  6. pprof - 在现网场景怎么用

    如何使用 pprof 来定位现网 Golang 问题,已经是一名 Gopher 所需要掌握的必备技能了.我们在实际工作中也经常使用它来定位现网问题.网上有很多文章来描述 pprof 的使用,但是实际的 ...

  7. Qt 实现涂鸦板三:实现鼠标绘制矩形

    .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #include " ...

  8. Qt 实现涂鸦板二:实现放大功能

    在一的基础上改造: .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #inc ...

  9. Qt 桌面服务 QDesktopServices

    使用浏览器打开网址 #include <QDesktopServices> #include <QUrl> QUrl url(QString("https://cn. ...

  10. Blocks(单调栈)

    题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列. 这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了. 接下来就是找 ...