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添加一个增添方法。

为了追求功能和性质,我们挑选谷歌(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
欢迎转发,请保留出处

相关文章