一, 前言
Redis 的介绍网上很多不再赘述. 本次环境为 net core 2.2, 使用的 StackExchange.Redis 来操作 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", 6379 } },
- //Password = "123456"
- };
- });
- //......
- }
具体的属性如下:
配置选项 | 默认 | 含义 |
---|---|---|
AbortOnConnectFail | true(false 在 Azure 上) | 如果为 true,Connect 则在没有服务器可用时将不会创建连接 |
AllowAdmin | false | 启用一系列被认为具有风险的命令 |
ChannelPrefix | null | 所有发布 / 订阅操作的可选通道前缀 |
ConnectRetry | 3 | 初始期间重复尝试连接的次数 & nbsp;Connect |
ConnectTimeout | 5000 | 连接操作超时(毫秒) |
ConfigurationChannel | __Booksleeve_MasterChanged | 用于传达配置更改的广播频道名称 |
ConfigCheckSeconds | 60 | 检查配置的时间(秒)。如果支持,它可以充当交互式套接字的保持活动状态。 |
DefaultDatabase | null | 默认数据库索引,从 0 到 databases - 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(20));
- 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(0);
用 GetDatabase()返回的对象成本很低, 不需要特殊存储. 可以传入 Redis 数据库的号码, 使用指定数据库, 上面的例子就是使用 0 号数据库.
拥有了 IDatabase 就可以调用方法去操作 Redis, 所有的方法都有同步和异步两套, 命名和微软要求的一样.
下面简单的对五种数据类型进行基础操作:
(1)String 字符串
添加
await redisConnection.GetDatabase().StringSetAsync(key, value, TimeSpan.FromSeconds(20));
获取
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);
来源: https://www.cnblogs.com/xwc1996/p/11973611.html