asp.net core 使用 Redis 和 Protobuf
asp.net core 使用 Redis 和 Protobuf
前言
上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件。项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存。 如果你觉得对你有帮助的话,不妨点个【推荐】。
目录
- Redis 介绍
- asp.net core Session 介绍
- Redis & Session 实例讲解
- Session的使用
- 使用 Protobuf 给 Session添加扩展方法
Redis 介绍
下面是Redis官网的介绍:
Redis is an open source (BSD licensed), in-memory data structure store, used as database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Redis 是一个开源的(基于BSD许可),内存数据存储结构,常用作数据库,缓存,和消息队列。它支持如字符串、哈希表、列表、集合、排序集范围查询、位图、hyperloglogs半径和地理空间索引与查询。Redis内置主从连接,Lua脚本、LRU回收,事务和不同级别文件持久化,并提供了利用集群的主从切换和自动分区等来保证高可用性。
Redis的深入介绍我就直接开传送门了,不是本篇的重点,但是我给你们整理了一下,你们还是要感谢我滴:
redis 高可用部署及监控:http://blog.sina.com.cn/s/blog_75ad98f30101fwqj.html
redis 主从连接:http://www.tuicool.com/articles/fAnYFb
redis 事务: http://redisbook.readthedocs.io/en/latest/feature/transaction.html
redis 内存回收LRU:http://www.open-open.com/lib/view/open1427547789059.html
redis 数据持久化:http://qifuguang.me/2015/10/13/Redis%E6%8C%81%E4%B9%85%E5%8C%96/
以上知识学习完,使用和面试时应付Redis的提问应该不成问题了。
asp.net core session 介绍
session本身是一个很难解释的名词,在http中session代表服务器与浏览器的一次会话过程,这个过程可能一直,也可能间断的。
asp.net core中的session以中间件的方式提供给我们来使用。
下面来看一下使用方法:
首先,添加session的NuGet包Microsoft.AspNetCore.Http.Abstractions到项目中,在startup.cs文件的ConfigureServices(IServiceCollection services)函数中,使用app.UseSession()和app.UseCaching()来使用session.
//在使用session之前要注入cacheing,因为session依赖于cache进行存储
services.AddCaching();
services.AddSession();
添加了session之后就需要有存储session的地方,可以使用内存存储,也可以使用其他自定义存储,比如redis或者SQL Server等。
// 重要: session的注册必须在UseMvc之前,因为MVC里面要用
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
Redis & Session 实例讲解
要在Session中使用Redis,只需要把services.AddCaching();换成services.AddDistributedRedisCache();就可以了,如下:
services.AddDistributedRedisCache(option =>
{
//redis 数据库连接字符串
option.Configuration = Configuration.GetConnectionString("RedisConnection");
//redis 实例名
option.InstanceName = "master";
}
);
Session的使用
在 asp.net core 的 MVC Controller 中,你可以HttpContext.Session来获取Session对象。
如果不是在 Controller 中需要使用 Session 的话,可以使用IHttpContextAccessor这个接口通过注入的方式来获取Session。
以下是在 Controller 中使用Session,需要引入Microsoft.AspNetCore.Http空间:
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.SetString("Test", "Ben Rules!");
return View();
}
public IActionResult About()
{
ViewBag.Message = HttpContext.Session.GetString("Test");
return View();
}
}
以下是在除了 Controller 的其他地方使用 Session:
public class SomeOtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
private ISession _session => _httpContextAccessor.HttpContext.Session;
public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void TestSet()
{
_session.SetString("Test", "Ben Rules!");
}
public void TestGet()
{
var message = _session.GetString("Test");
}
}
使用 Protobuf 给 Session添加扩展方法
默认情况下,我们只能存储byte[]到我们的Session当中,这让我们使用起来很不方便,在Microsoft.HttpCore.Extension中 Microsoft 给提供了一个SetString,SetInt32 和GetString,GetInt32的方法,但是在很多情况下,我们是需要使用Session来存储一个对象的,那么此时就需要给Session添加一个扩展方法。
为了追求效率和性能,我们选择Google的Protobuf序列化组件,而不使用Json.Net,在性能方面,Protobuf要比XML或者Json效率高很多。
在Nuget包中引入protobuf-net:
public static class SessionExtensions
{
public static T Get<T>(this ISession session, string key) where T : class {
byte[] byteArray = null;
if (session.TryGetValue(key, out byteArray)) {
using (var memoryStream = new MemoryStream(byteArray)) {
var obj = ProtoBuf.Serializer.Deserialize<T>(memoryStream);
return obj;
}
}
return null;
}
public static void Set<T>(this ISession session, string key, T value) where T : class {
try {
using (var memoryStream = new MemoryStream()) {
ProtoBuf.Serializer.Serialize(memoryStream, value);
byte[] byteArray = memoryStream.ToArray();
session.Set(key, byteArray);
}
}
catch (Exception) {
throw;
}
}
}
使用Protobuf-net序列化,需要在序列化的对象打上[ProtoContract][ProtoMember]等标记。
Ps:目前Redis的扩展Microsoft.Extensions.DependencyInjection下面的AddDistributedRedisCache还不支持RC2,可以去github上搜索源代码,添加到项目中,也可以留下邮箱,我会发给你。
本文地址:http://www.cnblogs.com/savorboard/p/5592948.html
作者博客:Savorboard
asp.net core 使用 Redis 和 Protobuf的更多相关文章
- ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存
前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...
- ASP.NET Core 使用 Redis 客户端
Mac OS 安装 Redis(用于连 Redis 服务器,方便查看数据):https://redis.io/topics/quickstart wget http://download.redis. ...
- ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis
ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...
- asp.net Core 使用redis(StackExchange.Redis)
原文:asp.net Core 使用redis(StackExchange.Redis) 一.添加配置(appsettings.json) "Redis": { "Def ...
- Asp.net Core 使用Redis存储Session
前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...
- asp.net core 运用 Redis 配置步骤
Redis可以用来存储session或直接存储键值对 首先要有asp.net core的项目,可以是webapi 或者MVC项目,还有有本地的Redis或者在远程服务器上,具体的安装就不讲述了 以下是 ...
- [转]Asp.net Core 使用Redis存储Session
本文转自:http://www.cnblogs.com/hantianwei/p/5723959.html 前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储 ...
- ASP.NET Core与Redis搭建一个简易分布式缓存
本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容.今天的目标是利用IDistributedCache来做一些分布式缓存,这样我们就可以横向扩展我们的web应用程序. 在本教程中,我将使用Re ...
- ASP.Net Core 使用Redis实现分布式缓存
本篇我们记录的内容是怎么在Core中使用Redis 和 SQL Server 实现分布式缓存. 一.文章概念描述 分布式缓存描述: 分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分 ...
随机推荐
- 正则RegEXp
JavaScript RegExp 对象 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 直接量语法 /pattern/attributes 创建 RegE ...
- SSIS 阻塞,半阻塞和全阻塞 (Non-blocking, semi-blocking and Fully-blocking) transformations清单
三种Blocking类型,这里跟数据流的Buff关系很大:■■ non-blocking transformations,每一行直接转换输出,没有等待.■■ partial-blocking tran ...
- mobilize扁平化的fullPage.js类工具使用心得
可以生成一个fullPage效果的主页,但是列表页面和内容页面呢? 主页中的block,可以选择多种组建生成.甚至连form都有: 应该改造其源代码,动态化和cms系统化,添加二三级页面模板: == ...
- linux ln 命令(转载)
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- Judge loop in directed graph
1 深度优先方法 首先需要更改矩阵初始化函数init_graph() 然后我们需要初始化vist标记数组 深度优先访问图,然后根据是否存在back edge判断是否存在环路 算法如下: #includ ...
- Arcengine 开发,FeatureClass新增feature时“The Geometry has no z-value”或"The Geometry has null z-value"的解决方案
Arcengine 开发,当图层含有Z值时,新增的feature没有Z值就会 出现“The Geometry has no z-value”的错误.意思很明显,新增的geometry没有Z值. 此时按 ...
- 高级UNIX环境编程11 线程
<pthread.h> pthread_equal pthread_self(void) pthread_create() pthread_close() pthread_join() p ...
- Week13(12月5日):不怕错误,慢慢来 :)
Part I:提问 =========================== 1.ASP.NET MVC的最新版本是( ). A.2 B.3 C.4 D.5 2.本学期授课中使 ...
- SQL分页存储过程(不支持多表联合查询,不支持多字段排序)
CREATE PROCEDURE [dbo].[Pro_GetPageOfRecords] @PageSize INT=20, --分页大小 @CurrentPage INT, --第几页 @Clum ...
- 通过原生js的ajax或jquery的ajax获取服务器的时间
在实际的业务逻辑中,经常是与时间相关的,而前端能获得的时间有两个:客户端的时间,服务器的时间. 客户端时间通过 javascript中的Date对象可以获取,如 var dt = new Date() ...