第十二节:Asp.Net Core 之分布式缓存(SQLServer和Redis)
一. 整体说明
1. 说明
分布式缓存通常是指在多个应用程序服务器的架构下,作为他们共享的外部服务共享缓存,常用的有SQLServer、Redis、NCache。
特别说明一下:这里的分布式是指多个应用程序服务器,而不是指将Redis或SQLServer部署成分布式集群。
2. 分布式缓存数据有以下几个特点
A. 跨多个服务器请求
B. 服务器重新启动和应用部署缓存仍然有效
C. 不使用本地缓存
本节主要介绍基于SQLServer和Redis的分布式缓存服务,在Asp.Net Core中,主要是基于IDistributedCache接口来实现分布式缓存服务。
3.缓存方法介绍
来自于IDistributedCache接口和DistributedCacheExtensions扩展类。
A. 读取:Get、GetString及其对应的异步方法。根据key键获取对应的值,Get方法返回的byte数组,这里更常用GetString方法,返回字符串。
B. 写入:Set、SetString及其对应的异步方法。同上,Set操控的是byte数组,这里更常用SetString方法。DistributedCacheEntryOptions,用于配置缓存的性质,下面详细介绍。
C. 移除:Remove及其对应的异步方法。根据key键来移除缓存。
D. 刷新重置:Refresh及其对应的异步方法。刷新缓存基于其密钥,重置其滑动到期超时值(如果有)中的项。
4. 缓存性质介绍
这里通过DistributedCacheEntryOptions类配置,通过F12观察代码可知,可以设置以下三个属性。
A. DateTimeOffset? AbsoluteExpiration:绝对过期时间,如: new DateTimeOffset(DateTime.Parse("2019-07-16 16:33:10"));
B. TimeSpan? AbsoluteExpirationRelativeToNow:绝对过期时间,如: TimeSpan.FromSeconds(10);
C. TimeSpan? SlidingExpiration:相对过期时间,如: TimeSpan.FromSeconds(10);
二. SqlServer分布式缓存
1. 前提
安装【Microsoft.Extensions.Caching.SqlServer】程序集,如果是Core MVC程序,自带的Microsoft.AspNetCore.App包里已经涵盖了该程序集,无需重复安装。
2. 使用步骤
A. 在数据库中新建一个名叫“CacheDB”表,然后以管理员身份cmd运行下面指令,会创建一张名叫“AspNetCoreCache”表,相应的缓存信息都存在于这张表中。
【dotnet sql-cache create "Server=localhost;User=sa;Password=123456;Database=CacheDB" dbo AspNetCoreCache】成功后会提示:Table and index were created successfully.
PS:补充表的结构和含义, 分别是键、值、到期时刻(有问题)、滑动过期时间、绝对过期时间。
B. 在ConfigureService中通过AddDistributedSqlServerCache方法注册SqlServer缓存服务,可以通过SqlServerCacheOptions对象全局配置缓存的性质。
(PS:也可以使用的时候通过DistributedCacheEntryOptions类配置)
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"SqlSeverConnectionString": "Server=localhost;User=sa;Password=123456;Database=CacheDB",
//暂时没用到,使用Redis的时候,没有设置密码
"RedisConnectionString": "172.16.1.250:6379,defaultDatabase=11,name=TestDb,password=Gworld2017,abortConnect=false"
}
//注册分布式的SQLServer缓存服务
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = Configuration["SqlSeverConnectionString"];
options.SchemaName = "dbo";
options.TableName = "AspNetCoreCache";
});
C. 通过构造函数注入IDistributedCache对象
public class ThirdController : Controller
{
public IDistributedCache _cache1 { get; set; } public ThirdController(IDistributedCache cache1)
{
_cache1 = cache1;
}
}
D. 通过GetString和SetString进行读取和写入,通过DistributedCacheEntryOptions类配置。
public IActionResult Index()
{ string nowTime = _cache1.GetString("t1");
if (string.IsNullOrEmpty(nowTime))
{
nowTime = DateTime.Now.ToString(); DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
//1.相对过期时间
//options.SlidingExpiration = TimeSpan.FromSeconds(10); //2. 绝对过期时间(两种形式)
options.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds();
//options.AbsoluteExpiration= new DateTimeOffset(DateTime.Parse("2019-07-16 16:33:10")); _cache1.SetString("t1", nowTime,options);
}
ViewBag.t1 = nowTime; return View();
}
4. 缓存性质的配置
(1) 全局配置
注册的时候通过SqlServerCacheOptions类配置,如下图,必须要配置的三个属性是:ConnectionString数据连接字符串、SchemaName表架构、Table表名称。
(2) 使用时配置
通过DistributedCacheEntryOptions类配置,上面已经介绍了。
5. 扩展缓存清除相关问题
在缓存过期后,每次调用 Get/GetAsync 方法都会 调用 SqlServerCache 的 私有方法 ScanForExpiredItemsIfRequired() 进行一次扫描, 然后清除所有过期的缓存条目,扫描方法执行过程也很简单,就是直接执行数据库查询语句 DELETE FROM {0} WHERE @UtcNow > ExpiresAtTime .
特别注意:异步方法中同步调用会导致过期的缓存清除不了,所以使用异步的话就异步到底。 await this.cache.GetStringAsync("CurrentTime");
三. Redis分布式缓存
1. 前提
安装【Microsoft.Extensions.Caching.StackExchangeRedis】程序集,Core MVC中这个也是不包含的。
2. 使用步骤
A. 下载Redis程序,打开redis-server.exe,启动Redis。
B. 在ConfigureService中通过AddStackExchangeRedisCache方法注册Redis缓存服务。 必须要设置的是Configuration连接字符串和InstanceName实例名。
//注册分布式的Redis缓存服务
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
C. 通过构造函数注入IDistributedCache对象。
D. 通过GetString和SetString进行读取和写入,通过DistributedCacheEntryOptions类配置。
C D 两步代码和上述SqlServer的完全相同。
public class ThirdController : Controller
{
public IDistributedCache _cache1 { get; set; } public ThirdController(IDistributedCache cache1)
{
_cache1 = cache1;
} public IActionResult Index()
{ string nowTime = _cache1.GetString("t1");
if (string.IsNullOrEmpty(nowTime))
{
nowTime = DateTime.Now.ToString(); DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
//1.相对过期时间
//options.SlidingExpiration = TimeSpan.FromSeconds(10); //2. 绝对过期时间(两种形式)
options.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds();
//options.AbsoluteExpiration= new DateTimeOffset(DateTime.Parse("2019-07-16 16:33:10")); _cache1.SetString("t1", nowTime,options);
}
ViewBag.t1 = nowTime; return View();
}
}
3. 缓存方法和缓存性质
同SqlServer中相同的完全相同
4. 缓存清除与SqlServer的区别
使用 Redis 分布式缓存允许你在异步方法中调用同步获取缓存的方法,这不会导致缓存清理的问题,因为缓存的管理已经完全交给了 Redis 客户端 StackExchange.Redis了
5. 总结
细心的你可能已经发现了,上面的这段代码和之前演示的 SqlServerCache 完全一致,是的,仅仅是修改一下ConfigureService注册的方法,我们就能在项目中进行无缝的切换;但是,对于缓存有强依赖的业务,建议还是需要做好缓存迁移,确保项目能够平滑过渡。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
第十二节:Asp.Net Core 之分布式缓存(SQLServer和Redis)的更多相关文章
- ASP.Net Core使用分布式缓存Redis从入门到实战演练
一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力. 所以经常要用到且不会频繁改变且被用户共享的 ...
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- ASP.NET Core 中的缓存
目录 缓存的基本概念 缓存原理 缓存设计 分布式缓存 Memcache 与 Redis 的比较 缓存穿透,缓存击穿,缓存雪崩解决方案 数据一致性 使用内置 MemoryCache 使用分布式缓存 Re ...
- ASP.NET Core ResponseCache进行缓存操作
前言 本章将介绍客户端缓存将介绍浏览器缓存和服务端缓存,使用浏览器缓存将减少对web服务器的请求次数,同时可以提升性能,避免重复的运算浪费. ASP.NET Core对于HTTP缓存分为两种: 客户端 ...
- 如何用分布式缓存服务实现Redis内存优化
Redis是一种支持Key-Value等多种数据结构的存储系统,其数据特性是“ALL IN MEMORY”,因此优化内存十分重要.在对Redis进行内存优化时,先要掌握Redis内存存储的特性比如字符 ...
- memached+asp.net 4.0 分布式缓存
由于准备做一个商品站点,希望做一个memached缓存.折腾了一个多星期.本机是存进去取出来为空. 各种办法都试过了,还是不行.最后用同事电脑測试是能够的,然后将DEMO公布到阿里云也是能够的.支持. ...
- 第十一节:Asp.Net Core 之内容缓存(IMemoryCache)
1. 整体说明 ASP.NET Core 支持多种不同的缓存,最简单的缓存基于 IMemoryCache,它表示存储在 Web 服务器内存中的缓存,内存缓存可以存储任何对象,存储形式键值对,需要 .n ...
- Distributed Cache(分布式缓存)-SqlServer
分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务存储在单个应用服务器上,常用的有SqlServer,Redis,NCache. 分布式缓存可以提高ASP.NET Core应用程序的性能和可伸缩 ...
- 组件-------(一)redis系列--安装部署redis+实现redis分布式缓存 java+Spring+redis
目的:解决单机session不能共享问题,插入查询数据库时间效率问题,实现分布式缓存. 准备材料:Redis 下载链接 http://pan.baidu.com/s/1dEGTxvV 相关jar包如果 ...
随机推荐
- Windows下VS Code打开黑屏解决办法(这样真的行)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_42421611/article/d ...
- 如何在相同的类名中单独为选中元素设置JS
很多时候,我发现对一个类名添加事件,每次都是所有同类名元素一起触发,使用 this可以仅对当前选中的元素应用事件 如 $('.guowai button').click(function() { /* ...
- iOS开发工具:Alcatraz、SVGKit、Lin以及Transformifier等
转自:http://www.cocoachina.com/applenews/devnews/2013/0606/6352.html Alcatraz:Xcode包管理器 Alcatraz是一个开源的 ...
- 2019CISCN web题赛-JustSoSo;love_math(复现)
0x00前言 这几天从网上找个CMS源码开始练习审计,盯着众多的代码debug调呀调头晕脑胀的,还不错找到个文件读取和一个ssrf... 上月底结束的CISCN线上赛,web四道,仔细研究的2道,做出 ...
- 【案例】电子生产中的排程问题如何解决?APS助力智能化排产
共进电子是典型的消费类电子制造企业,以ODM业务为主,立足双O(OEM/ODM),发展自主品牌.其中,生产模式特点包括: 批量制造.多品种小批量.面向订单生产: 产品结构复杂,设计变更频繁:生产计划复 ...
- Html引入百度富文本编辑器ueditor及自定义工具栏
在日常工作用,肯定有用到富文本编辑器的时候,富文本编辑器功能强大使用方便,我用的是百度富文本编辑器,首先需要下载好百度编辑器的demo, 然后创建ueditor.html文件,引入百度编辑器,然后在h ...
- docker在linux上的安装
docker安装在liunx环境上,我电脑用的是ubuntu系统的,需要下载对应系统的docker,我下载的是社区版,对着官方的命令敲就好了, 地址是:https://docs.docker.com/ ...
- Linux CentOS 6.5 ifconfig查询不到ip简单解决方法
最近有小伙伴表示在虚拟机中安装CentOS之后使用ifconfig以及ip addr指令无法查询到ip地址, 在此笔者提供一个简单有效的方法; 1. 切换为root用户登录 su root 2.进入配 ...
- java static学习
原创,转载请注明来源sogeisetsu的博客园 static,在类里面定义公共的属性,它可以统一修改,并只占一个内存.从而达到方便修改和少占内存的目的 先放上代码,您可以先越过代码,看后面的讲解内容 ...
- flask-restful在解析的请求一定要传content-type:application/json吗?答:其实不需要!
在处理flask-restful api请求时,因为postman发送的格式为text,没有携带content-type:application/json,在解析参数的时候,参数的值都给搞成了空,导致 ...