【SQL Server】ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

前言

上篇博文介绍了什么样在
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添加一个恢弘方法。

为了追求作用和属性,大家采取谷歌的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还不帮助路虎极光C2,可以去github上搜索源代码,添加到花色中,也可以留下邮箱,我会发给你。


正文地址:http://www.cnblogs.com/savorboard/p/5592948.html
作者博客:Savorboard
迎接转发,请保留出处

相关文章