asp.net core 使用 Redis 和 Protobuf

前言

上篇博文介绍了怎么样在 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

asp.net core 使用 Redis 和 Protobuf的更多相关文章

  1. ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

    前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...

  2. ASP.NET Core 使用 Redis 客户端

    Mac OS 安装 Redis(用于连 Redis 服务器,方便查看数据):https://redis.io/topics/quickstart wget http://download.redis. ...

  3. ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis

    ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...

  4. asp.net Core 使用redis(StackExchange.Redis)

    原文:asp.net Core 使用redis(StackExchange.Redis) 一.添加配置(appsettings.json) "Redis": { "Def ...

  5. Asp.net Core 使用Redis存储Session

    前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...

  6. asp.net core 运用 Redis 配置步骤

    Redis可以用来存储session或直接存储键值对 首先要有asp.net core的项目,可以是webapi 或者MVC项目,还有有本地的Redis或者在远程服务器上,具体的安装就不讲述了 以下是 ...

  7. [转]Asp.net Core 使用Redis存储Session

    本文转自:http://www.cnblogs.com/hantianwei/p/5723959.html 前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储 ...

  8. ASP.NET Core与Redis搭建一个简易分布式缓存

    ​本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容.今天的目标是利用IDistributedCache来做一些分布式缓存,这样我们就可以横向扩展我们的web应用程序. 在本教程中,我将使用Re ...

  9. ASP.Net Core 使用Redis实现分布式缓存

    本篇我们记录的内容是怎么在Core中使用Redis 和 SQL Server 实现分布式缓存. 一.文章概念描述   分布式缓存描述: 分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分 ...

随机推荐

  1. python下module、package导入

    #encoding=utf-8"""模块:1.import demo #导入demo.py下的所有的函数,调用方法为:demo.function()2.from demo ...

  2. No.4小白的HTML+CSS心得篇

    书读百遍,其义自见 遵照这句话 今天再次重新把慕课网的HTML+CSS看了一遍,再次阅读感受不再是那么陌生,从而心里默默地喜欢上了这种方式,坚持. 好了,开始今天的收获小总结 1.html中,表单&l ...

  3. HttpContext的解释意义

    在.ashx中,我们HttpContext这个词,到底是什么意思?下面给大家说说 HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息. 在处理请求执行链的各个阶段中, ...

  4. D - 1sting(相当于斐波那契数列,用大数写)

    Description You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ...

  5. Android 开发笔记 “广播组件使用”

    在Activity中,注册广播的一个Demo. 总共分3步 第一步:定义一个BroadcastReceiver广播接收类: private BroadcastReceiver mBroadcastRe ...

  6. vs 2010 引用DLL 遇到问题

    1.新建项目→添加引用,提示:未能添加对dll的引用,请确保此文件可访问并且是一个有效的程序集或COM组件 解决方案:首先把DLL放system32中,然后,regsvr32 绝对路径注册一下: 如果 ...

  7. Python学习之day4

    参考文献:http://www.cnblogs.com/alex3714/articles/5143440.html 迭代器: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直 ...

  8. 使用python操作RabbitMQ,Redis,Memcache,SQLAlchemy 其一

    一.概念 1.Memcached     Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...

  9. 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)

    最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i- ...

  10. bash:xxx:command not found

    前几天在centos6.0上配好了oracle 10g并且能够执行oracle相关命令,但是今天准备往oracle里倒数据时,执行sqlplus 出现bash:command not found [o ...