Net DB Web多级缓存的实现
1、客户端缓存(浏览器缓存)
HTTP有一套控制缓存的协议-RFC7234,其中最重要的就是cache-control这个相应报文头,服务器返回时,如果Response带上
cache-control:max-age=5 #表示允许浏览器缓存5秒(仅是允许,浏览器是否缓存还看浏览器本身机制是否要遵循这套缓存协议)
Net 封装好了一个缓存特性,如:
public class HomeController : ControllerBase
{
[ResponseCache(Duration = 5)]//告诉浏览器可用缓存5秒,Duration必须定义,不然请求会报错
[HttpGet("GetNowDateTime")]
public string GetNowDateTime()
{
return DateTime.Now.ToString();
}
}
执行多次请求

第一行为首次请求,Response Headers:
cache-control: public,max-age=5 #告诉浏览器进行缓存
content-encoding: gzip
content-type: text/plain; charset=utf-8
date: Sun, 19 Mar 2023 07:17:50 GMT
server: Microsoft-IIS/10.0
vary: Accept-Encoding
x-powered-by: ASP.NET
后续5s内的请求,都会从缓存中取,Size=disk cache即为缓存,取到的返回值和首次请求一致,直到过了5s,再次向服务器发起请求。
PS:勾选 Disable cache,发出的请求头 Request Headers会加上
cache-control: no-cache #不从缓存中取数
2、服务器端缓存
如果有大量客户端访问服务器获取数据,仅依靠客户端缓存,还是会让服务器多次运行接口程序
服务端缓存就是为了解决这个问题
.Net 添加服务器缓存中间件
//app.UseCors(); //跨域,如果有
app.UseResponseCaching();//启动服务器缓存,位置介于这两中间件之间
app.MapControllers();
UseResponseCaching中间件需要和ResponseCache特性配合使用
Api代码仍为
public class HomeController : ControllerBase
{
[ResponseCache(Duration = 5)]//告诉浏览器可用缓存5秒
[HttpGet("GetNowDateTime")]
public string GetNowDateTime()
{
return DateTime.Now.ToString();
}
}
打开两个浏览器访问尝试,功能实现!!!
不过,这种服务器缓存方式十分鸡肋,存在的限制太多:
a)无法解决恶意请求给服务器带来的压力(Request Header带上了cache-control: no-cache,不仅浏览器不读缓存,服务器也不读)
b)响应码=200的Get或者Head的响应才会被缓存
c)报文头带有Authorization、Set-Cookie等响应,不会缓存
3、内存缓存
内存缓存需要自身在代码定义,仅针对业务层面的缓存,不受请求头影响
添加内存缓存服务
builder.Services.AddScoped<IDBHelper, SqlServerHelper>(); //db注入
builder.Services.AddMemoryCache();//内存缓存
模拟SqlServerHelper类
namespace DIDemo.Services
{
public record Staff(int Id, string acc);
public class SqlServerHelper : IDBHelper
{
List<Staff> _staff_list = new List<Staff>();
public SqlServerHelper() {
_staff_list.Add(new Staff(1,"tom"));
_staff_list.Add(new Staff(2,"jerry"));
}public Staff? GetStaff(int Id)
{
return this._staff_list.Find(x => x.Id == Id);
}
}
}
定义一个查询员工的接口
using DIDemo.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory; namespace DIDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
private readonly IDBHelper _db;
private readonly IMemoryCache _menCache; public HomeController(IDBHelper db, IMemoryCache menCache)
{
_db = db;
_menCache = menCache;
} [HttpGet("GetStaff")]
public ActionResult<Staff> GetStaff(int Id)
{
Console.WriteLine("begin");
//1、从缓存取数据 2、缓存取不到,从数据库取,添加缓存
var items = _menCache.GetOrCreate<Staff>($"staff_{Id}", (e) =>
{
Console.WriteLine("缓存不存在,开始写缓存");
e.AbsoluteExpirationRelativeToNow= TimeSpan.FromSeconds(15); //15s后过期
e.SlidingExpiration = TimeSpan.FromSeconds(5); //5s滑动过期:5s内访问过缓存,会重新开始计算5s
return _db.GetStaff(Id);
});
if (items == null)
{
return NotFound($"员工ID={Id},不存在");
}
return items;
}
}
}
GetOrCreate,如果获取不到,就通过委托,查询数据库并写入缓存
AbsoluteExpirationRelativeToNow:固定的过期时间
SlidingExpiration:滑动过期时间
两个时间可用单独定义,也可以一起定义,其中一个过期即为过期,通常不单独使用SlidingExpiration,可能造成缓存无限续命
4、分布式缓存
涉及微服务,负载均衡,需要一个集中管理的缓存服务,也就是我们的分布式缓存
老生常谈的Redis,看看以前写的文章吧!
Net DB Web多级缓存的实现的更多相关文章
- 探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现
大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过前面的文章,我们一起剖析了Guav ...
- Java高并发--CPU多级缓存与Java内存模型
Java高并发--CPU多级缓存与Java内存模型 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 CPU多级缓存 为什么需要CPU缓存:CPU的频率太快,以至于主存跟 ...
- 001-CPU多级缓存架构
一.基本概念 大致关系: CPU Cache --> 前端总线 FSB (下图中的Bus) --> Memory 内存 CPU 为了更快的执行代码.于是当从内存中读取数据时,并不是只读自己 ...
- [Asp.net web api]缓存
摘要 为了提高接口的性能,我们常做的优化就包括缓存,对经常访问但变化不大的数据进行缓存.或者使用http的缓存,减少请求的次数. web api缓存 在提供的api,我们也可以实现缓存,来减少访问的次 ...
- java手写多级缓存
多级缓存实现类,时间有限,该类未抽取接口,目前只支持两级缓存:JVM缓存(实现 请查看上一篇:java 手写JVM高性能缓存).redis缓存(在spring 的 redisTemplate 基础实现 ...
- Redis 多级缓存架构和数据库与缓存双写不一致问题
采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存 ...
- Redis: 缓存过期、缓存雪崩、缓存穿透、缓存击穿(热点)、缓存并发(热点)、多级缓存、布隆过滤器
Redis: 缓存过期.缓存雪崩.缓存穿透.缓存击穿(热点).缓存并发(热点).多级缓存.布隆过滤器 2019年08月18日 16:34:24 hanchao5272 阅读数 1026更多 分类专栏: ...
- 并发与高并发(三)-CPU多级缓存の乱序执行优化
一.CPU多级缓存-乱序执行优化 处理器或编译器为提高运算速度而做出违背代码原有顺序的优化. 重排序遵循原则as-if-serial as-if-serial语义:不管怎么重排序(编译器和处理器为了提 ...
- WEB端缓存机制
WEB端缓存机制 什么是WEB缓存 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请 ...
- 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
随机推荐
- Docker部署OpenWRT-旁路由
1.确认网卡名称 命令 ip addr 显示如下图的 enp2s0 就是我们准备进行链接的网卡名称. 2.打开网卡的混杂模式 sudo ip link set enp2s0 promisc on 3. ...
- 打开part文件夹
1 #include <uf.h> 2 #include <uf_ui.h> 3 #include <uf_part.h> 4 #include <atlst ...
- iOS block相关面试题
一.前言本文重点来研究一下 objc 的 block,并具体来分析一下以下一些面试题目:block 的内部实现,结构体是什么样?block 是类吗?有哪些类型?一个 int 变量被 __block 修 ...
- 微信小程序使用echart图表不随着页面滚动
1,问题描述 使用echarts时界面滑动时,图标不跟随滑动,浮在元素上方. 2,最简单的方法 在ec-canvas中添加,force-use-old-canvas="true", ...
- #科技 #资讯 #生活 RTX 4080显卡在欧跌破建议零售价, 小鹏回应自研电池, Meta因泄漏超5亿用户资料被罚款 ,黑猫投诉开启2022“你我同心 反诈同行”系列活动,这就是今天的其它大新闻
今天是2022年11月29日 十一月初六 现在是下午15:29 下面是今天的其他大新闻 #NEWS 1 #RTX 4080在欧跌破建议零售价 ( IT 之家 )据 PCGamesHardware 报道 ...
- Linux_ZABBIX实战
typora-copy-images-to: img ZABBIX实战 zabbix安装 Zabbix详解 zabbix中文社区: http://www.zabbix.org.cn/ Zabbix中文 ...
- reflection反射
reflection反射 动态和静态语言 动态语言 动态语言就是一类在运行时可以改变其结构的语言,通俗点说就是在运行时代码可以根据某些条件改变自身结构 主要动态语言:object-C,C#,JavaS ...
- C# 类库 dll 读取配置文件信息
一:给 C# 类库 dll 添加配置文件并读取配置信息 效果: 1.给类库程序添加配置文件,并命名为:类库名.DLL.config 如上面效果图,类库为:API.dll ,那么其对应的类库配置文件为: ...
- PHP做API开发该如何设计签名验证
前言 开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可 ...
- Honeywell安卓版手持机设置广播方式
设置>Honeywell设置>扫描设置>Internal Scanner>Default profile>Data Processing Settings>Data ...