前言

上篇博文介绍了何等在
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自个儿是1个很难解释的名词,在http中session代表服务器与浏览器的2遍对话进程,那一个进程或然直接,也或许付之东流的。

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添加3个恢宏方法。

为了追求功效和质量,大家选取谷歌(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还不帮助凯雷德C二,能够去github上搜索源代码,添加到花色中,也足以留下邮箱,笔者会发给你。


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

相关文章

网站地图xml地图