使用Asp.Net Core MVC 开发项目实践[第五篇:缓存的使用]
项目中我们常常会碰到一些数据,需要高频率用到但是又不会频繁变动的这类,我们就可以使用缓存把这些数据缓存起来(比如说本项目的导航数据,帖子频道数据).
我们项目中常用到有Asp.Net Core 本身提供的缓存组件MemoryCache以及第三方缓存组件Redis(当然这个不仅仅只用来做缓存工具用).
MemoryCache组件的使用:
第一步:我们在Startup类中ConfigureServices方法中添加缓存组件
services.AddMemoryCache();
第二步:我们就可以在项目中使用该缓存组件了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using MVCDemo.Core.Cache;
namespace MVCDemo.Web.Controllers
{
public class CacheController : Controller
{
IMemoryCache _cache = null;
public CacheController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
//MemoryCache示例
string memoryCache = _cache.Get<string>("memoryCacheTest");
if (string.IsNullOrEmpty(memoryCache))
{
//添加并且设置缓存
_cache.Set<string>("memoryCacheTest", "我是memoryCacheTest缓存");
memoryCache = _cache.Get<string>("memoryCacheTest");
}
ViewData["memoryCache"] = memoryCache;
return View();
}
}
}
PS:在这里我们使用的构造函数注入的方式获取到了MemoryCache的实例对象
Redis缓存组件的使用:
PS:我们使用的是Windows系统上安装的Redis组件,安装教程请查看https://www.51core.net/posts/read/3048
第一步:使用Nuget添加Microsoft.Extensions.Caching.Redis组件

第二步:将Redis常用方法封装成一个服务
1.创建一个ICacheService的接口,方便缓存组件的扩展
using System;
using System.Collections.Generic;
using System.Text;
namespace Mango.Framework.Services.Cache
{
public interface ICacheService
{
/// <summary>
/// 获取缓存
/// </summary>
/// <typeparam name="T">泛型(返回的结果类型)</typeparam>
/// <param name="key">缓存key</param>
/// <returns></returns>
T Get<T>(string key) where T : new();
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <returns></returns>
string Get(string key);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">缓存值</param>
/// <param name="ExpirationTime">绝对过期时间(分钟)</param>
);
/// <summary>
/// 移除缓存
/// </summary>
/// <param name="key"></param>
void Remove(string key);
/// <summary>
/// 更新缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="ExpirationTime"></param>
);
}
}
2.创建一个RedisCacheService类继承自ICacheService接口并且实现接口中的方法
using System;
using System.Text;
using Microsoft.Extensions.Caching.Redis;
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
namespace Mango.Framework.Services.Cache
{
public class RedisCacheService:ICacheService
{
private RedisCache _redisCache = null;
public RedisCacheService(RedisCacheOptions options)
{
_redisCache = new RedisCache(options);
}
/// <summary>
/// 获取缓存
/// </summary>
/// <typeparam name="T">泛型(返回的结果类型)</typeparam>
/// <param name="key">缓存key</param>
/// <returns></returns>
public T Get<T>(string key) where T:new()
{
try
{
if (!string.IsNullOrEmpty(key))
{
return JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(_redisCache.Get(key)));
}
return default(T);
}
catch
{
return default(T);
}
}
/// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <returns></returns>
public string Get(string key)
{
try
{
if (!string.IsNullOrEmpty(key))
{
return Encoding.UTF8.GetString(_redisCache.Get(key));
}
return string.Empty;
}
catch
{
return null;
}
}
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">缓存值</param>
/// <param name="ExpirationTime">绝对过期时间(分钟)</param>
)
{
if (!string.IsNullOrEmpty(key))
{
_redisCache.Set(key, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions()
{
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(expirationTime)
});
}
}
/// <summary>
/// 移除缓存
/// </summary>
/// <param name="key">缓存key</param>
public void Remove(string key)
{
if (!string.IsNullOrEmpty(key))
{
_redisCache.Remove(key);
}
}
/// <summary>
/// 更新缓存
/// </summary>
/// <param name="key">缓存key</param>
/// <param name="value">缓存值</param>
/// <param name="ExpirationTime"></param>
)
{
if (!string.IsNullOrEmpty(key))
{
_redisCache.Remove(key);
_redisCache.Set(key, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions()
{
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(expirationTime)
});
}
}
}
}
PS:该类中的构造函数负责创建Redis缓存的实例并且把相关的参数(连接字符串)传入进行连接
第三步:在Startup类中ConfigureServices添加封装的服务组件
//注册自定义服务
services.AddSingleton(typeof(ICacheService), new RedisCacheService(new RedisCacheOptions()
{
Configuration = Configuration.GetSection("Cache:ConnectionString").Value,
InstanceName = Configuration.GetSection("Cache:InstanceName").Value
}));
//注册到全局服务控制类中以供其它项目的使用
Framework.Services.ServiceContext.RegisterServices(services);
第四步:在项目中调用,示例代码如下
ICacheService cacheService = ServiceContext.GetService<ICacheService>();
string cacheData = cacheService.Get("WebSiteConfigCache");
到此ASP.NET CORE MVC项目中缓存的使用介绍已经完成.
使用Asp.Net Core MVC 开发项目实践[第五篇:缓存的使用]的更多相关文章
- 使用Asp.Net Core MVC 开发项目实践[第三篇:基于EF Core的扩展]
上篇我们说到了EFCore的基础使用,这篇我们将讲解下基于EFCore的扩展. 我们在Mango.Framework.EFCore类库项目中创建一个类名EFExtended的扩展类,并且引入相关的命名 ...
- 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...
- 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]
先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...
- 使用Asp.Net Core MVC 开发项目实践[第二篇:EF Core]
在项目中使用EF Core还是比较容易的,在这里我们使用的版本是EF Core 2.2. 1.使用nuget获取EF Core包 这个示例项目使用的是SQLSERVER,所以还需要下载Microsof ...
- 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版
“全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- 使用 ASP.NET Core MVC 创建 Web API(五)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...
- ASP.NET Core MVC+EF Core从开发到部署
笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...
- ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件-开源
ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core. 曾经在WebForms上写过 HighchartsNET快速图表控件- ...
随机推荐
- 模板学习实践二 pointer
c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...
- oracle序列的使用
第一天:序列的使用 在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方. 1.Create Sequence 你首先要有CREATE SEQ ...
- HTML语言
复习: 1.Web项目的部署结构 静态Web技术(客户端技术):提供的内容任何人在任何时间访问都是一样的 HTML/CSS/JS/Flash.... 动态Web技术(服务器端技术):提供的内容不同人 ...
- 2019.02.28 bzoj4199: [Noi2015]品酒大会(sam+线段树)
传送门 题意:给一个串,每个位置有一个权值,当S[s...s+len−1]=S[t...t+len−1]&&S[s...s+len]̸=S[t..t+len]S[s...s+len-1 ...
- 服务器安装ubuntu 14.04 server,开机启动屏幕不停滚动错误WRITE SAME failed. Manually zeroing
昨天给服务器上安装了一个Ubuntu-14.04-server系统,安装完成后系统可以正常启动,但屏幕上一直滚动着一个错误,sda1:WRITE SAME failed. Manually zeroi ...
- MySQL中Decimal类型和Float Double等区别
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...
- Rabbit mq 简单应用
参考:http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html 简答模式(exchange不工作) import pika # ...
- Python简介及环境安装
Python 官网传送门 Python是一种面向对象的解释性计算机程序设计语言. Python 2.7将于2020年1月1日终止支持,本笔记基于Python3. pip pip 是一个现代的,通用的 ...
- samba服务配置(二)
需求: 某公司销售部门提出一个文件共享需求,要求部门共享目录有三个,第一个共享目录所有销售部门人员都具有可读可写权限: 第二个共享目录所有销售人员只读权限,经理级别的销售人员具有可读可写权限:第三个共 ...
- 安装stress模拟linux系统资源消耗
1.安装yum源:yum install epel-release -y 2.安装stress:yum install stress -y 3.使用样例:stress -c 1 -t 60 4.测试场 ...