【转载】在AspNetCore 中 使用Redis实现分布式缓存
原文地址:https://www.cnblogs.com/szlblog/p/9045209.html
AspNetCore 使用Redis实现分布式缓存
上一篇讲到了,Core的内置缓存:IMemoryCache,以及缓存的基础概念。本篇会进行一些概念上的补充。
本篇我们记录的内容是怎么在Core中使用Redis 和 SQL Server 实现分布式缓存。
一、文章概念描述
分布式缓存描述:
分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁、事物、系统 等有很多。使我们对分布式本身就有一个很明确的认识,分布式就是有多个应用程序组成,可能分布在不同的服务器上,最终都是在为web端提供服务。
分布式缓存有以下几点优点:
(1)所有的Web服务器上的缓存数据都是相同的,不会因为应用程序不同,服务器的不同导致缓存数据的不一样。
(2)缓存的是独立的不受Web服务器的重新启动或被删除添加的影响,也就是说这些Web的改变不到导致缓存数据的改变。
传统的单体应用架构因为用户的访问量的不高,缓存的存在大多数都是存储用户的信息,以及一些页面,大多数的操作都是直接和DB进行读写交互,这种架构简单,也称为简单架构,
传统的OA项目比如ERP,SCM,CRM等系统因为用户量不大也是因为大多数公司业务的原因,单体应用架构还是很常用的架构,但是有些系统随着用户量的增加,业务的扩张扩展,导致DB的瓶颈的出现。
以下我所了解到的关于这种情况的处理有以下两种
(1):当用户访问量不大,但是读写的数据量很大的时候,我们一般采取的是,对DB进行读写分离、一主多从、对硬件进行升级的方式来解决DB瓶颈的问题。
这样的缺点也同样纯在:
1、用户量大的时候怎么办?,
2、对于性能的提升有限,
3、性价比不高。提升一点性能就需要花费很多代价,(打个比方,现在的I/O吞吐量是0.9的需要提升到1.0,我们在增加机器配置的情况下这个价格确实很可观的)
(2):当用户访问量也增加的时候,我们就需要引入缓存了来解决了,一张图描述缓存的大致的作用。
缓存主要针对的是不经常发生改变的并且访问量很大的数据,DB数据库可以理解为只作为数据固化的或者只用来读取经常发生改变的数据,上图中我没有画SET的操作,就是想特意说明一下,缓存的存在可以作为一个临时的数据库,我们可以通过定时的任务的方式去同步缓存和数据库中的数据,这样做的好处是可以转移数据库的压力到缓存中。
缓存的出现解决了数据库压力的问题,但是当以下情况发生的时候,缓存就不在起到作用了,缓存穿透、缓存击穿、缓存雪崩这三种情况。
缓存穿透:我们的程序中用缓存的时候一般采取的是先去缓存中查询我们想要的缓存数据,如果缓存中不存在我们想要的数据的话,缓存就失去了做用(缓存失效)我们就是需要伸手向DB库去要数据,这个时候这种动作过多数据库就崩溃了,这种情况需要我们去预防了。比如说:我们向缓存获取一个用户信息,但是故意去输入一个缓存中不存在的用户信息,这样就避过了缓存,把压力重新转移到数据上面了。对于这种问题我们可以采取,把第一次访问的数据进行缓存,因为缓存查不到用户信息,数据库也查询不到用户信息,这个时候避免重复的访问我们把这个请求缓存起来,把压力重新转向缓存中,有人会有疑问了,当访问的参数有上万个都是不重复的参数并且都是可以躲避缓存的怎么办,我们同样把数据存起来设置一个较短过期时间清理缓存。
缓存击穿:事情是这样的,对于一些设置了过期时间的缓存KEY,在过期的时候,程序被高并发的访问了(缓存失效),这个时候使用互斥锁来解决问题,
互斥锁原理:通俗的描述就是,一万个用户访问了,但是只有一个用户可以拿到访问数据库的权限,当这个用户拿到这个权限之后重新创建缓存,这个时候剩下的访问者因为没有拿到权限,就原地等待着去访问缓存。
永不过期:有人就会想了,我不设置过期时间不就行了吗?可以,但是这样做也是有缺点的,我们需要定期的取更新缓存,这个时候缓存中的数据比较延迟。
缓存雪崩:是指多种缓存设置了同一时间过期,这个时候大批量的数据访问来了,(缓存失效)数据库DB的压力又上来了。解决方法在设置过期时间的时候在过期时间的基础上增加一个随机数尽可能的保证缓存不会大面积的同事失效。
二、文章内容实现
在AspNetCore中使用 Redis实现缓存:
在项目中引用:using Microsoft.Extensions.Caching.Distributed; 使用IDistributedCache
IDistributedCache 接口
IDistributedCache接口包含同步和异步方法。 接口允许在分布式缓存实现中添加、检索和删除项。 IDistributedCache接口包含以下方法:
Get、 GetAsync
采用字符串键并以byte[]形式检索缓存项(如果在缓存中找到)。
Set、SetAsync
使用字符串键向缓存添加项byte[]形式)。
Refresh、RefreshAsync
根据键刷新缓存中的项,并重置其可调过期超时值(如果有)。
Remove、RemoveAsync
根据键删除缓存项。
以下是我的代码封装DistributedCache类名:主要针对IDistributedCache中非异步方法,异步只写了一个简单的例子:
1、Get()获取缓存
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object Get(string key)
{
string ReturnStr = "";
if (!string.IsNullOrEmpty(key))
{
if (Exists(key))
{
ReturnStr = Encoding.UTF8.GetString(_cache.Get(key));
}
}
return ReturnStr;
}
2、GetAsync()异步获取缓存
/// <summary>
/// 使用异步获取缓存信息
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public async Task<object> GetAsync(string key)
{
string ReturnString = null;
var value = await _cache.GetAsync(key);
if (value != null)
{
ReturnString = Encoding.UTF8.GetString(value);
}
return ReturnString;
}
3、Set()设置或添加缓存
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Add(string key, object value)
{
byte[] val = null;
if (value.ToString() != "")
{
val = Encoding.UTF8.GetBytes(value.ToString());
}
DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
//设置绝对过期时间 两种写法
options.AbsoluteExpiration = DateTime.Now.AddMinutes();
// options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(30));
//设置滑动过期时间 两种写法
options.SlidingExpiration = TimeSpan.FromSeconds();
//options.SetSlidingExpiration(TimeSpan.FromSeconds(30));
//添加缓存
_cache.Set(key, val, options);
//刷新缓存
_cache.Refresh(key);
return Exists(key);
}
4、Remove()删除缓存
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(string key)
{
bool ReturnBool = false;
if (key != "" || key != null)
{
_cache.Remove(key);
if (Exists(key) == false)
{
ReturnBool = true;
}
}
return ReturnBool;
}
5、修改缓存
/// <summary>
/// 修改缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool Modify(string key, object value)
{
bool ReturnBool = false;
if (key != "" || key != null)
{
if (Remove(key))
{
ReturnBool = Add(key, value.ToString());
} }
return ReturnBool;
}
6、验证缓存是否存在
/// <summary>
/// 验证是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Exists(string key)
{
bool ReturnBool = true;
byte[] val = _cache.Get(key);
if (val == null || val.Length == )
{
ReturnBool = false;
}
return ReturnBool;
}
三、文章内容调用
以上是代码的封装:下面是在AspnetCore中调用
1、首先安装Redis缓存:这个网上找个下载安装就行
2、然后下载安装:客户端工具:RedisDesktopManager(方便管理)
3、在我们的项目Nuget中 引用 Microsoft.Extensions.Caching.Redis
4、在项目启动Setup.cs中注册:Redis服务:代码如下
public void ConfigureServices(IServiceCollection services)
{
//将Redis分布式缓存服务添加到服务中
services.AddDistributedRedisCache(options =>
{
//用于连接Redis的配置 Configuration.GetConnectionString("RedisConnectionString")读取配置信息的串
options.Configuration = "localhost";// Configuration.GetConnectionString("RedisConnectionString");
//Redis实例名RedisDistributedCache
options.InstanceName = "RedisDistributedCache";
});
services.AddMvc();
}
5、我是用CoreAPI来写的 控制器中代码如下:
1)先实例对象
private DistributedCache _Cache; /// <summary>
/// 构造注入
/// </summary>
/// <param name="Cache"></param>
public ValuesController(IDistributedCache Cache)
{
_Cache = new DistributedCache(Cache);
}
2)调用DistributedCache 类中的方法 代码如下:
[HttpGet("{id}")]
public string Get(int id)
{
//添加
bool booladd = _Cache.Add("id", "sssss");
//验证
bool boolExists = _Cache.Exists("id");
//获取
object obj = _Cache.Get("id");
//删除
bool boolRemove = _Cache.Remove("id");
//修改
bool boolModify = _Cache.Modify("id", "ssssssss"); return obj.ToString();
}
【转载】在AspNetCore 中 使用Redis实现分布式缓存的更多相关文章
- 在AspNetCore 中 使用Redis实现分布式缓存
AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemoryCache,以及缓存的基础概念.本篇会进行一些概念上的补充. 本篇我们记录的内容是怎么在Core中使 ...
- 在AspNetCore 中 使用Redis实现分布式缓存 (转载)
文章概念描述 分布式缓存描述:分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有 ...
- AspNetCore Redis实现分布式缓存
分布式缓存描述: 分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有多个应用程序 ...
- 三点须知:当我们在开发过程中需要用到分布式缓存Redis的时候
当我们在开发过程中需要用到分布式缓存Redis的时候,我们首先要明白缓存在系统中用来做什么? 1. 少量数据存储,高速读写访问.通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的 ...
- CentOS中搭建Redis伪分布式集群【转】
解压redis 先到官网https://redis.io/下载redis安装包,然后在CentOS操作系统中解压该安装包: tar -zxvf redis-3.2.9.tar.gz 编译redis c ...
- ASP.Net Core 使用Redis实现分布式缓存
本篇我们记录的内容是怎么在Core中使用Redis 和 SQL Server 实现分布式缓存. 一.文章概念描述 分布式缓存描述: 分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分 ...
- ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis
ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...
- WEB 应用缓存解析以及使用 Redis 实现分布式缓存
什么是缓存? 缓存就是数据交换的缓冲区,用于临时存储数据(使用频繁的数据).当用户请求数据时,首先在缓存中寻找,如果找到了则直接返回.如果找不到,则去数据库中查找.缓存的本质就是用空间换时间,牺牲数据 ...
- Redis实现分布式缓存
Redis 分布式缓存实现(一) 1. 什么是缓存(Cache) 定义:就是计算机内存中的一段数据: 2. 内存中数据特点 a. 读写快 b. 断电立即丢失 3. 缓存解决了什么问题? a. 提 ...
随机推荐
- xmind的使用及入门
初识 xmind是什么 比较 入门 下载 基本操作 主界面 美化 工具 导出 初识 xmind是什么 说白了就是传说中的思维导图,用它我们可以画出下面这些图: 额,这张图好丑. 好吧,换一张: 他就是 ...
- bzoj 4589 Hard Nim——FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 一开始异或和为0的话先手必败.有 n 堆,每堆可以填那些数,求最后异或和为0的方案数, ...
- Loadrunner-场景设置以及监控结果分析
一.Controller的基本工作原理:通过1.2.3设置来模拟用户的操作,收集出4的各种信息 二.场景设置一般步骤 1.新建场景(Controller) 2.添加脚本 3.设置Schedule(设置 ...
- 使用PowerShell在Azure China创建Data Warehouse
微软的Azure Data Warehouse是基于MPP架构的分布式系统: Control Node负责管理系统和接受用户的请求,Compute Node负责计算. 目前在国内Azure Data ...
- BMP格式转JPEG格式
int Bmp2Jpg(const char *bmp_data, const char *jeg_file, const int width, const int height) { int ret ...
- C语言 字符串中数字的运算
主函数中输入字符串"32486"和"12345",在主函数中输出的函数值为44831. #include <stdio.h> #include &l ...
- NHibernate使用总结(2)
首先,映射文件的名称一定要是XXX.hbm.xml且生成方式一定要是嵌入的资源+不复制. hibernate.cfg.xml这个文件要放在根目录下,且生成方式必须是内容+始终复制. private v ...
- install命令和cp命令的区别
基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务——拷贝文件,它们之间的区别主要如下: 1.最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件 ...
- 开源JS代码前面加!,+的意义
我们都知道,函数的声明方式有这两种 function fnA(){alert('msg');}//声明式定义函数 var fnB = function(){alert('msg');}//函数赋值表达 ...
- 将chrome浏览器的默认背景颜色修改为浅绿色,以减缓长时间看电脑的眼睛不舒服的问题
修改chrome文件夹中的Custom.css, 此文件里面默认内容是空的. 在其中添加下面这段代码: 你也可以选择自己的喜欢的颜色, 前提是你知道你想要更改的颜色的十六进制颜色值, 例如:#CCEB ...