.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. 关于商业智能(Business Intelligence,简称BI)的认识

    一.早期(1958年)定义 商业智能描述了一系列的概念和方法,通过应用基于事实的支持系统来辅助商业决策的制定. 二.帆软数据调研 帆软数据应用研究院对770多家企业的1400多名从业人员进行了调研(云 ...

  2. [Android开发学iOS系列] iOS项目环境搭建和依赖管理

    iOS项目环境搭建和依赖管理 一个项目总是会依赖一些库, 有些是第三方的, 有些可能是项目自身为了复用拆出去的. 现有主流的iOS依赖有多种形式, 比如CocoaPods, Carthage和swif ...

  3. #分类讨论#CF891A Pride

    题目 你有一个长度为 \(n\) 的数列 \(a\),你能执行一些操作. 每个操作是这样的:选择两个相邻的数 \(x\) 和 \(y\),把 它们中的一个 换为 \(\gcd(x,y)\). 问你把数 ...

  4. OpenHarmony页面级UI状态存储:LocalStorage

      LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例.LocalStorage也可以在UIAbility内,页面间共享 ...

  5. 如何在现实场景中随心放置AR虚拟对象?

    随着AR的发展和电子设备的普及,人们在生活中使用AR技术的门槛降低,比如对于不方便测量的物体使用AR测量,方便又准确:遇到陌生的路段使用AR导航,清楚又便捷:网购时拿不准的物品使用AR购物,体验更逼真 ...

  6. maven 创建spring boot 需要的配置[一]

    前言 之所以写这个是因为现在官方推荐云创建: 所以标注一下maven project,创建后,如何导入spring boot. 正文 1.步骤一 在pom.xml 中加入: <dependenc ...

  7. ping 介绍

    前言 因为要整理网络这一块,所以打算先把概念写下.这节介绍ping的实现原理. 正文 先看一下图: 又没有发现和我们的icmp很像?对头.在icmp中,我写道:icmp有两种报文,一种是差错报文,一种 ...

  8. arp 的概念解析

    前言 这里基于arp的基础概念,请先看前面那一节. 正文 看图: 和前面一样去解析地址. 以太网目的地址:就是mac地址. 在发送arp包的时候呢,这个mac地址就是全部是1,因为不知道对方地址是啥. ...

  9. JavaScript如何判断一个元素是否在可视区域中?

    一.用途 可视区域即我们浏览网页的设备肉眼可见的区域,如下图 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片 ...

  10. js中this对象的理解

    一.定义 函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定) th ...