.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. hadoop集群实现分发文件命令xsync脚本文件

    1 #!/bin/bash 2 3 #1. 判断参数个数 4 if [ $# -lt 1 ] 5 then 6 echo Not Enough Arguement! 7 exit; 8 fi 9 10 ...

  2. Scala 可变列表ListBuffer

    1 package chapter07 2 3 import scala.collection.mutable.ListBuffer 4 5 object Test05_ListBuffer { 6 ...

  3. Python 列表list方法clear( )和直接list [ ]的区别

    x.clear()是将内存地址清空, x=[ ]会新开辟一个内存空间.

  4. 5W1H聊开源之Why——为什么要参与开源?

    中国开源的发展速度发展加快,个人和组织对于为开源作贡献有着前所未有的激情.据<2020年IT行业项目管理调查报告>,约四成受访者以自己开发开源项目.为他人提交项目代码.作为成员开发维护项目 ...

  5. MyBatis的映射关系

    MyBatis的映射关系是有一个默认的,采用下划线命名的方式将数据库表的列名按照驼峰式映射成 Java 实体类的属性名 举个例子数据库表名为 tb_user,其中的字段名为 inst_code,对应的 ...

  6. Android Graphics 多屏同显/异显 - C++示例程序(标准版)

    "为了理解Android多屏同显/异显的基本原理,我们将从Native Level入手,基于Graphics APIs写作一个简单的C++版本的多屏显示互动的演示程序.通过这个程序我们将了解 ...

  7. 定时运行BAT文件

    引用:https://www.cnblogs.com/lidj/archive/2012/07/07/2580598.html 1.Form.cs: using CC=System.Web.Mail; ...

  8. FreeMarker 去除循环末尾的符号

    在使用 FreeMarker 模板引擎来生成文件时,经常会使用到 list 标签用于循环生成. 有时会遇到需要处理末尾符号的情况,比如 Json 文件,循环生成的标签中末尾是不需要 , 的,例如: & ...

  9. 家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

    前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔. 因为没有资格,也没有钱在一线城市买房 (); 但是在要结婚之前,婚房又是刚需. 我和太太最终一起在一线城市周边的某二线城市买了 ...

  10. 鸿蒙智联生态产品《接入智慧生活App开发指导》(官方更新版)

    原文:https://mp.weixin.qq.com/s/BDC-12aiZz2EhtjYLR7QIg,点击链接查看更多技术内容. 在HarmonyOS Connect生态产品应用开发过程中,很多开 ...