前言

上篇博文介绍了什么当
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
欢迎转载,请保留出处

相关文章

网站地图xml地图