ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存
本文内容纲要:
-前言
-目录
-Redis介绍
-asp.netcoresession介绍
-Redis&Session实例讲解
-Session的使用
-使用Protobuf给Session添加扩展方法
前言
上篇博文介绍了怎么样在asp.netcore中使用中间件,以及如何自定义中间件。项目中刚好也用到了Redis,所以本篇就介绍下怎么样在asp.netcore中使用Redis进行资源缓存和Session缓存。如果你觉得对你有帮助的话,不妨点个【推荐】。
目录
- Redis介绍
- asp.netcoreSession介绍
- Redis&Session实例讲解
- Session的使用
- 使用Protobuf给Session添加扩展方法
Redis介绍
下面是Redis官网的介绍:
Redisisanopensource(BSDlicensed),in-memorydatastructurestore,usedasdatabase,cacheandmessagebroker.Itsupportsdatastructuressuchasstrings,hashes,lists,sets,sortedsetswithrangequeries,bitmaps,hyperloglogsandgeospatialindexeswithradiusqueries.Redishasbuilt-inreplication,Luascripting,LRUeviction,transactionsanddifferentlevelsofon-diskpersistence,andprovideshighavailabilityviaRedisSentinelandautomaticpartitioningwithRedisCluster.
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.netcoresession介绍
session本身是一个很难解释的名词,在http中session代表服务器与浏览器的一次会话过程,这个过程可能一直,也可能间断的。
asp.netcore中的session以中间件的方式提供给我们来使用。
下面来看一下使用方法:
首先,添加session的NuGet包Microsoft.AspNetCore.Http.Abstractions
到项目中,在startup.cs
文件的ConfigureServices(IServiceCollectionservices)
函数中,使用app.UseSession()
和app.UseCaching()
来使用session.
//在使用session之前要注入cacheing,因为session依赖于cache进行存储
services.AddCaching();
services.AddSession();
添加了session之后就需要有存储session的地方,可以使用内存存储,也可以使用其他自定义存储,比如redis或者SQLServer等。
//重要: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.netcore的MVCController中,你可以HttpContext.Session
来获取Session对象。
如果不是在Controller中需要使用Session的话,可以使用IHttpContextAccessor
这个接口通过注入的方式来获取Session。
以下是在Controller中使用Session,需要引入Microsoft.AspNetCore.Http
空间:
publicclassHomeController:Controller
{
publicIActionResultIndex()
{
HttpContext.Session.SetString("Test","BenRules!");
returnView();
}
publicIActionResultAbout()
{
ViewBag.Message=HttpContext.Session.GetString("Test");
returnView();
}
}
以下是在除了Controller的其他地方使用Session:
publicclassSomeOtherClass
{
privatereadonlyIHttpContextAccessor_httpContextAccessor;
privateISession_session=>_httpContextAccessor.HttpContext.Session;
publicSomeOtherClass(IHttpContextAccessorhttpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
publicvoidTestSet()
{
_session.SetString("Test","BenRules!");
}
publicvoidTestGet()
{
varmessage=_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
:
publicstaticclassSessionExtensions
{
publicstaticTGet<T>(thisISessionsession,stringkey)whereT:class{
byte[]byteArray=null;
if(session.TryGetValue(key,outbyteArray)){
using(varmemoryStream=newMemoryStream(byteArray)){
varobj=ProtoBuf.Serializer.Deserialize<T>(memoryStream);
returnobj;
}
}
returnnull;
}
publicstaticvoidSet<T>(thisISessionsession,stringkey,Tvalue)whereT:class{
try{
using(varmemoryStream=newMemoryStream()){
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
欢迎转载,请保留出处
本文内容总结:前言,目录,Redis介绍,asp.netcoresession介绍,Redis&Session实例讲解,Session的使用,使用Protobuf给Session添加扩展方法,
原文链接:https://www.cnblogs.com/savorboard/p/5592948.html