一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
上次给大家推荐过一个缓存中间件《一个C#开发的非常实用的缓存中间件》,今天再给大家推荐一个缓存中间件,两者功能差不多,都是提供统一接口、多级缓存、分布式缓存、支持多种Provider等。
项目简介
这是一个基于.Net Core开发的缓存中间件,它支持各种缓存并提供了很多高级功能。它的主要目标是让开发人员开发更简单、特别是一些复杂的缓存场景。
项目特色功能
1、统一缓存接口:方便我们随时调整缓存策略;
2、支持多种缓存:可以满足我们多种业务场景;
3、支持多种缓存系列化:BinaryFormatter、Newtonsoft.Json,MessagePack和Protobuf;
4、支持缓存AOP:able, put,evict,可以简化我们的代码量;
5、多实例支持;
6、支持Diagnostics:方便我们跟踪定位;
7、针对Redis支持特殊Provider:比如原子递增递减的操作等等;
8、二级缓存。
技术架构
1、跨平台:这是基于.Net Core开发的系统,可以部署在Docker, Windows, Linux。
2、基于Net 6.0开发。
3、支持缓存类别:本地缓存:InMemory,SQLite;分布式缓存:StackExchange.Redis,csredis,EnyimMemcachedCore。
项目结构

===
使用方法
**配置缓存
**
在Startup.cs,配置缓存
public void ConfigureServices(IServiceCollection services)
{
......
services.AddEasyCaching(option =>
{
//内存缓存:default
option.UseInMemory("default");
//内存缓存:cus
option.UseInMemory("cus");
//redis缓存:redis1
option.UseRedis(config =>
{
config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379));
config.DBConfig.SyncTimeout = 10000;
config.DBConfig.AsyncTimeout = 10000;
config.SerializerName = "mymsgpack";
}, "redis1")
.WithMessagePack("mymsgpack")//with messagepack serialization
;
//redis缓存:redis2
option.UseRedis(config =>
{
config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6380));
}, "redis2");
//sqlite缓存
option.UseSQLite(config =>
{
config.DBConfig = new SQLiteDBOptions { FileName = "my.db" };
});
//memcached 缓存
option.UseMemcached(config =>
{
config.DBConfig.AddServer("127.0.0.1", 11211);
});
option.UseMemcached(Configuration);
//fasterKv缓存
option.UseFasterKv(config =>
{
config.SerializerName = "msg";
})
.WithMessagePack("msg");
});
}
**使用方式
**
public class CusController : Controller
{
//缓存
private readonly IEasyCachingProviderFactory _factory;
public CusController(IEasyCachingProviderFactory factory)
{
this._factory = factory;
}
// GET api/cus/inmem?name=Default
[HttpGet]
[Route("inmem")]
public string Get(string name = EasyCachingConstValue.DefaultInMemoryName)
{
//根据name,获取缓存实例
var provider = _factory.GetCachingProvider(name);
var val = name.Equals("cus") ? "cus" : "default";
var res = provider.Get("demo", () => val, TimeSpan.FromMinutes(1));
return $"cached value : {res}";
}
......
}
ResponseCache缓存
[ResponseCache(Duration = 30, VaryByQueryKeys = new string[] { "page" })]
public IActionResult List(int page = 0)
{
return Content(page.ToString());
}
AOP缓存
[EasyCachingAble(Expiration = 10)]
string GetCurrentUtcTime();
[EasyCachingPut(CacheKeyPrefix = "Castle")]
string PutSomething(string str);
[EasyCachingEvict(IsBefore = true)]
void DeleteSomething(int id);
项目地址
更多开源项目请查看:一个专注推荐优秀.Net开源项目的榜单
- End -
文章首发于公众号【编程乐趣】,欢迎大家关注。

一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存的更多相关文章
- 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis
Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...
- 三分钟学会Redis在.NET Core中做缓存中间件
大家好,今天给大家说明如何在.NET Core中使用Redis,我们在想要辩论程序的好与坏,都想需要一个可视化工具,我经常使用的是一位国内大牛开发的免费工具,其Github地址为: https://g ...
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- .NET Core开源API网关 – Ocelot中文文档
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butterfly ...
- Ocelot - .Net Core开源网关
Ocelot - .Net Core开源网关 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html 源码地 ...
- Ocelot(一)- .Net Core开源网关
Ocelot - .Net Core开源网关 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html 源码地 ...
- Github上优秀的.NET Core开源项目的集合
内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:https://github.com/jasonhua95/ ...
- 开源分布式中间件 DBLE 快速入门指南
GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...
- ASP.NET Core 3.1 中间件
参考微软官方文档 : https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 ...
- ASP.NET Core错误处理中间件[3]: 异常处理器
DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作.ExceptionHandlerMid ...
随机推荐
- 「SOL」E-Lite (Ural Championship 2013)
为什么这数据能水到可以枚举角度 ac 啊 # 题面 给你 \(n\) 个平面向量 \((x_i,y_i)\),对于每个 \(k=1\sim n\),求「从给出的 \(n\) 个向量中不重复地选择 \( ...
- python菜鸟学习: 1.用户登录输入输出
# -*-coding: utf-8 -*-name = 'liyuzhoupan'password = '123'def login_test(): count = 0 while count &l ...
- S32DS中链接文件及启动代码学习
S32DS中链接文件及启动代码学习 一.链接文件 <Linker Files>文件夹中有linker_flash.ld文件和linker_ram.ld文件. Linker File称为链接 ...
- c++学习8 动态空间申请
一 动态分配内存的概述 在数组一幕中,介绍过数组的长度是事先预定好的,在整个程序中固定不变.但是在实际的编程过程中,往往会发生这种情况:我们并不清楚到底需要多少数目的空间,而且无法事先预定,所以对了应 ...
- js-var,let ,const 的区别
变量提升: 在js预编译阶段,函数和变量的声明会被提前检索编译,打乱了编写时的声明顺序. 函数字面量表达式不会被提升 var a = function(){}; ex: console.log(a) ...
- c 理解
exit() 的含义:提前结束程序 .c 文件 return的含义 :提前结束函数,其所在行以下,整体大函数底花括号以上,2者之间的所有语句都不会被执行到,用它来提前结束程序. break的含义 :提 ...
- 5-3 掌握 egg.js + 云 mongodb
1 egg.js 1.1 初始化 初始化和项目启动方法 # 初始化 $ mkdir egg-example && cd egg-example $ npm init egg --typ ...
- 面向对象ooDay8
精华笔记: 接口: 是一种数据类型(引用类型) 由interface定义 只能包含常量和抽象方法(所有数据默认都是常量,所有方法默认都是抽象的) 接口不能被实例化 接口是需要被实现/继承的,实现/派生 ...
- 跨域获取iframe页面的url
一:跨域获取iframe页面的url 1.在使用iframe页面的js添加以下内容 <script> var host = window.location.href; var histor ...
- NOIP2015普及组
T1 金币 很简单的题,控制天数这个变量 #include<iostream> #include<cstring> #include<cmath> #include ...