一、前言

  Redis的介绍网上很多不再赘述。本次环境为net core 2.2,使用的StackExchange.Redis来操作Redis。以前的StackExchange.Redis存在连接超时的情况,现在使用最新版本并全部使用异步方法可以解决。

二、引用Microsoft.Extensions.Caching.StackExchangeRedis

  通过nuget搜索Microsoft.Extensions.Caching.StackExchangeRedis安装,因为依赖项版本的问题我这里用的版本是2.2.5,其本质上也是封装的StackExchange.Redis,但是它实现了net core规定的IDistributedCache接口。

三、添加redis服务

  在Startup.cs中的ConfigureServices中添加Redis的服务,会自动进行依赖注入。最简单的如下:

        public void ConfigureServices(IServiceCollection services)
{//......
//添加redis连接
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "127.0.0.1:6379";
options.InstanceName = "SampleInstance";
});
//......
}

  InstaceName:实例名,加在redis的key前面的。

  Configuration:连接redis的链接。

  还存在一个优先级更高的ConfigurationOptions,可以配置多个redis服务的连接、密码等。

        public void ConfigureServices(IServiceCollection services)
{//.....
//添加redis连接
services.AddStackExchangeRedisCache(options =>
{
options.ConfigurationOptions = new ConfigurationOptions()
{
EndPoints = { { "127.0.0.1", } },
//Password = "123456"
};
});
//......
}

  具体的属性如下:

配置选项 默认 含义
AbortOnConnectFail truefalse在Azure上) 如果为true,Connect则在没有服务器可用时将不会创建连接
AllowAdmin false 启用一系列被认为具有风险的命令
ChannelPrefix null 所有发布/订阅操作的可选通道前缀
ConnectRetry 3 初始期间重复尝试连接的次数 Connect
ConnectTimeout 5000 连接操作超时(毫秒)
ConfigurationChannel __Booksleeve_MasterChanged 用于传达配置更改的广播频道名称
ConfigCheckSeconds 60 检查配置的时间(秒)。如果支持,它可以充当交互式套接字的保持活动状态。
DefaultDatabase null 默认数据库索引,从0databases - 1
KeepAlive -1 发送消息以帮助套接字保持活动的时间(秒)(默认为60秒)
ClientName null 标识Redis中的连接
Password null Redis服务器密码
Proxy Proxy.None 使用中的代理类型(如果有);例如“ twemproxy”
ResolveDns false 指定DNS解析应该是明确且渴望的,而不是隐式的
ResponseTimeout SyncTimeout 决定套接字是否不健康的时间(毫秒)
Ssl false 指定应使用SSL加密
SslHost null 在服务器的证书上强制使用特定的SSL主机身份
SslProtocols null 使用加密连接时支持Ssl / Tls版本。使用“ |” 提供多个值。
SyncTimeout 5000 允许同步操作的时间(毫秒)
TieBreaker __Booksleeve_TieBreak 在模棱两可的主方案中用于选择服务器的密钥
DefaultVersion 3.0在Azure中,否则2.0 Redis版本级别(在服务器不可用时有用)
WriteBuffer 4096 输出缓冲区的大小

四、操作Redis

  在控制器中通过构造函数依赖注入获取redis连接对象。

public class HomeController : Controller
{
  private readonly IDistributedCache cache;
  public HomeController(IDistributedCache _cache)
  {
    this.cache = _cache;
  }
}

  由于是实现了IDistributedCache规定的接口Get、Set、Remove、Refresh等。

  所以设置缓存(有则更新,无则新增)、获取缓存、刷新缓存(不是刷新值是刷新过期时间)和删除缓存的代码如下。

//编辑缓存
cache.SetString(key, value);
//获取缓存
var values = cache.GetString(key);
//更新缓存过期时间
cache.RefreshAsync(key);
//删除缓存
cache.RemoveAsync(key);

  如果想设置缓存过期时间则通过DistributedCacheEntryOptions,它可以设置滑动过期时间(SlidingExpiration)、绝对过期时间(AbsoluteExpiration)和相对于现在的绝对过期时间(AbsoluteExpirationRelativeToNow)。

var options = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds());
cache.SetString(key, value, options);

  通过redis的可视化工具Redis Desktop Manager可以看到缓存存储在一号库为hash类型,有我们存储的值、滑动过期时间和绝对过期时间。不过获取到的数据为string。

五、使用StackExchange.Redis

  上面的代码存在一个问题,就是IDistributedCache之后对缓存的存储默认为其规定格式的hash类型,虽然我们获取到的数据为string。这样我们想操作list、set等其他类型就不行了,并且不能指定库进行存储。所以为了更加灵活这时候就要直接用StackExchange.Redis。

  因为引用Microsoft.Extensions.Caching.StackExchangeRedis的时候已经带上了StackExchange.Redis.dll的依赖项,所以不用再引用了,否则在nuget中搜索StackExchange.Redis进行引用。

  1.基本使用

  StackExchange.Redis 中核心对象是在 StackExchange.Redis 命名空间中的 ConnectionMultiplexer 类,这个对象隐藏了多个服务器的详细信息。 因为 ConnectionMultiplexer 要做很多事,所以它被设计为在调用者之间可以共享和重用,不需要在执行每一个操作的时候就创建一个 ConnectionMultiplexer ,它完全是线程安全的。 但现在,让我们来先创建一个ConnectionMultiplexer 类的实例保存以重用。 使用 ConnectionMultiplexer.Connect 或 ConnectionMultiplexer.ConnectAsync方法,传递配置字符串或ConfigurationOptions 对象(同上面提到过的)。 配置字符串可以采用逗号分隔的一系列节点的形式访问多个服务,所以让我们在默认端口(6379)上连接到本地机器上的一个实例:

private static ConnectionMultiplexer redisConnection { get; }
static RedisCache()
{
  redisConnection = ConnectionMultiplexer.Connect("127.0.0.1:6379");
}

  ConnectionMultiplexer实现了IDisposable接口而且可以在不再需要的时候处理释放掉。

  2.使用Redis

  访问Redis使用上述获取的连接对象:

IDatabase db = redisConnection.GetDatabase();

  用GetDatabase()返回的对象成本很低,不需要特殊存储。可以传入redis数据库的号码,使用指定数据库,上面的例子就是使用0号数据库。

  拥有了IDatabase就可以调用方法去操作redis,所有的方法都有同步和异步两套,命名和微软要求的一样。

  下面简单的对五种数据类型进行基础操作:

  (1)String字符串

  添加

await redisConnection.GetDatabase().StringSetAsync(key, value, TimeSpan.FromSeconds());

  获取

await redisConnection.GetDatabase().StringGetAsync(key);

  (2)List列表

  从列表底部和顶部插入

//底部插入
await redisConnection.GetDatabase().ListRightPushAsync(key, value);
//顶部插入
await redisConnection.GetDatabase().ListLeftPushAsync(key, value);

  从列表底部和顶部获取一个数据

//底部获取一个
await redisConnection.GetDatabase().ListRightPopAsync(key);
//顶部获取一个
await redisConnection.GetDatabase().ListLeftPopAsync(key);

  (3)Hash哈希

  添加

await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value1);
await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value2);

  获取

await redisConnection.GetDatabase().HashGetAsync(key, primaryKey);

  (4)Set集合

  添加

await redisConnection.GetDatabase().SetAddAsync(key, value);

  获取并集

await redisConnection.GetDatabase().SetCombine(SetOperation.Union, key1, key2);

  (5)Sorted Set有序集合

  添加

await redisConnection.GetDatabase().SortedSetAdd(key, value, sort);

  

.Net Core使用分布式缓存Redis:基础的更多相关文章

  1. ASP.Net Core使用分布式缓存Redis从入门到实战演练

    一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.  所以经常要用到且不会频繁改变且被用户共享的 ...

  2. .Net Core使用分布式缓存Redis:数据结构

    一.前言 本篇主要使用StackExchangeRedis在.Net Core中使用Redis,使用基础见:点击此处. 二.五种基础数据结构 1.字符串类型String 字符串类型是Redis中最基本 ...

  3. .Net Core使用分布式缓存Redis:Lua脚本

    一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...

  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍

    笔记 1.分布式缓存Redis介绍      简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具          1.redis官网 https://redis.io/download   ...

  5. 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇

    Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...

  6. 企业项目开发--分布式缓存Redis

    第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...

  7. 第十章 企业项目开发--分布式缓存Redis(2)

    注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据 ...

  8. 分布式缓存Redis应用场景解析

    Redis的应用场景非常广泛.虽然Redis是一个key-value的内存数据库,但在实际场景中,Redis经常被作为缓存来使用,如面对数据高并发的读写.海量数据的读写等. 举个例子,A网站首页一天有 ...

  9. 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

随机推荐

  1. C语言存储类别和链接

    目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 ​ 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...

  2. 小白学 Python(16):基础数据类型(函数)(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  3. NOI1995 石子合并 [Luogu P1880]

    一道区间dp的模板题,这里主要记一下dp时环形数据的处理. 简略版:方法一:枚举分开的位置,将圈化为链,因此要做n次. 方法二:将链重复两次,即做一个2n-1长度的链,其中第i(i<=n)堆石子 ...

  4. K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法

    1. 基于实例的学习算法 0x1:数据挖掘的一些相关知识脉络 本文是一篇介绍K近邻数据挖掘算法的文章,而所谓数据挖掘,就是讨论如何在数据中寻找模式的一门学科. 其实人类的科学技术发展的历史,就一直伴随 ...

  5. [考试反思]0921csp-s模拟测试49:困顿

    太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...

  6. python学习之【第六篇】:Python中的字典及其所具有的方法

    1.前言 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,因此,字典的key必须是可哈 ...

  7. echarts动态刷新数据

    在这次的项目中图表显示的部分比较多,这边给分享下用到的图表的数据刷新 饼图最后的效果 先看下 前端部分 <div div style="height: 40%; width: 17.5 ...

  8. 字符串(str)

    把字符连成串串. 在python中⽤用', ", ''', """引起来的内容被称为字符串串. 字符串是不可变的对象,所以任何操作对原字符串是不会有任何影响的 ...

  9. .NET进阶篇06-async异步、thread多线程2

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.线程Thread1.生命周期2.后台线程3.静态方法1.线程本地存储2.内存栅栏4.返回值二.线程池ThreadPool1.工作队 ...

  10. PowerDesigner列名、注释内容互换

    资料来源:PowerDesigner列名.注释内容互换 文中一共提供了2种操作的代码. (1)将Name中的字符COPY至Comment中 (2)将Comment中的字符COPY至Name中 使用方法 ...