上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件。项目中恰好也用到了Redis,因此本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存。 若是你以为对你有帮助的话,不妨点个【推荐】。html
下面是Redis官网的介绍:git
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.github
Redis 是一个开源的(基于BSD许可),内存数据存储结构,经常使用做数据库,缓存,和消息队列。它支持如字符串、哈希表、列表、集合、排序集范围查询、位图、hyperloglogs半径和地理空间索引与查询。Redis内置主从链接,Lua脚本、LRU回收,事务和不一样级别文件持久化,并提供了利用集群的主从切换和自动分区等来保证高可用性。面试
Redis的深刻介绍我就直接开传送门了,不是本篇的重点,可是我给大家整理了一下,大家仍是要感谢我滴: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的提问应该不成问题了。浏览器
session自己是一个很难解释的名词,在http中session表明服务器与浏览器的一次会话过程,这个过程可能一直,也可能间断的。缓存
asp.net core中的session以中间件的方式提供给咱们来使用。服务器
下面来看一下使用方法:
首先,添加session的NuGet包Microsoft.AspNetCore.Http.Abstractions
到项目中,在startup.cs
文件的ConfigureServices(IServiceCollection services)
函数中,使用app.UseSession()
和app.UseCaching()
来使用session.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" }); });
要在Session中使用Redis,只须要把services.AddCaching();
换成services.AddDistributedRedisCache();
就能够了,以下:
services.AddDistributedRedisCache(option => { //redis 数据库链接字符串 option.Configuration = Configuration.GetConnectionString("RedisConnection"); //redis 实例名 option.InstanceName = "master"; } );
在 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"); } }
默认状况下,咱们只能存储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 欢迎转载,请保留出处