ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【译】StackExchange.Redis中文文档(一)基础

2020-10-14 17:02:56  阅读:339  来源: 互联网

标签:... 订阅 redis ConnectionMultiplexer value db 文档 StackExchange Redis


基础用法

StackExchange.Redis 最核心的对象是 StackExchange.Redis.ConnectionMultiplexerConnectionMultiplexer 被设计成可在多个调用之间共享使用。不需要为每个操作创建一个 ConnectionMultiplexer,它是完全线程安全的。可以通过使用 ConnectionMultiplexer.ConnectConnectionMultiplexer.ConnectAsync 来完成,并传入配置字符串或 ConfigurationOptions对象。 配置字符串可以采用一系列逗号分隔的节点的形式:

using StackExchange.Redis;
...
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
// ^^^ store and re-use this!!!

ConnectionMultiplexer 实现 IDisposable,不再使用时可释放,但短暂使用的情况很少见。

更复杂的情况可能涉及主/副本设置。对于此用法,只需指定所有节点(它将自动识别主节点):

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");

如果发现两个节点都是主节点,则可以选择指定用于解决问题的仲裁键,但这种情况很罕见。

有了 ConnectionMultiplexer 之后,你可能需要做以下三件事:

  • 访问 redis 数据库(使用集群时,单个逻辑数据库可能分布在多个节点上)
  • 使用 redis 的发布/订阅功能
  • 访问单独服务器以进行维护/监视

使用 redis 数据库

访问 redis 数据库非常简单:

IDatabase db = redis.GetDatabase();

GetDatabase 返回的对象是一个成本很低的通道对象,不需要存储。

请注意,redis 支持多个数据库(虽然“集群”不支持),可以在 GetDatabase 的参数中指定。

此外,如果打算使用异步API,需要 Task.AsyncState 有一个值,也可以指定:

int databaseNumber = ...
object asyncState = ...
IDatabase db = redis.GetDatabase(databaseNumber, asyncState);

得到 IDatabase 后,就可以使用 redis API。 请注意,所有方法都具有同步和异步实现。

最简单的操作是存储和检索值:

string value = "abcdefg";
db.StringSet("mykey", value);
...
string value = db.StringGet("mykey");
Console.WriteLine(value); // writes: "abcdefg"

请注意,这里的前缀 String... 表示 redis 的 String 类型,与 .NET 的 String 类型不同,尽管都可以存储文本数据。另外,redis 允许键和值都使用二进制数据:

byte[] key = ..., value = ...;
db.StringSet(key, value);
...
byte[] value = db.StringGet(key);

redis 数据库命令涵盖所有 redis 数据类型。

使用 redis 发布/订阅

redis 的另一个常见用法是作为 发布/订阅消息分发工具。

这也很简单,并且在连接失败的情况下,ConnectionMultiplexer 将处理重新订阅所请求的信道的所有细节。

ISubscriber sub = redis.GetSubscriber();

同样,从 GetSubscriber 返回的对象是一个不需要存储的低成本的通道对象。

发布/订阅 API 没有数据库的概念,但和之前一样,我们可以选择的提供一个异步状态。

注意,所有订阅都是全局的:它们不限于 ISubscriber 实例的生命周期。

redis 中的发布/订阅功能使用命名的 “channels” ;channels 不需要事先在服务器上定义(这里有一个有趣的用法是利用每个用户的通知渠道类驱动部分的实时更新)

如在.NET中常见的,订阅采用回调委托的形式,它接受通道名称和消息:

sub.Subscribe("messages", (channel, message) => {
    Console.WriteLine((string)message);
});

注意:这里 StackExchange.Redis 捕获并丢弃异常,以防止级联失败。要处理失败,请在处理程序中使用
try/catch 来执行您所希望的操作(有任何例外情况)。

在 v2 中,你可以订阅没有回调的 Subscribe() 方法,而使用 ChannelMessageQueue (表示有序发布/订阅通知的消息队列)作为替代。

可以使用 ChannelMessageQueue.OnMessage() 方法,提供同步(Action<ChannelMessage>)和异步(Func<ChannelMessage,Task>)的重载方法。

// Synchronous handler
sub.Subscribe("messages").OnMessage(channelMessage => {
    Console.WriteLine((string) channelMessage.Message);
});

// Asynchronous handler
sub.Subscribe("messages").OnMessage(async channelMessage => {
    await Task.Delay(1000);
    Console.WriteLine((string) channelMessage.Message);
});

你可以单独发布到此频道:

sub.Publish("messages", "hello");

这把 "hello" 写入订阅进程的控制台。通道名和消息都可以是二进制的。

有关顺序和并发消息处理的使用说明,请查看发布/订阅消息顺序

访问单个服务器

出于维护目的,有时有必要发出服务器特定的命令:

IServer server = redis.GetServer("localhost", 6379);

GetServer 方法将接受一个 EndPoint 或唯一标识服务器的名称/值对。 从 GetServer 返回的对象是成本很低的通道对象,不需要存储,并且可以选择指定异步状态。请注意,可用 endpoints 也可用:

EndPoint[] endpoints = redis.GetEndPoints();

IServer 实例中,可以使用 Server 命令。 例如:

DateTime lastSave = server.LastSave();
ClientInfo[] clients = server.ClientList();

同步 vs 异步 vs 执行且忽略

StackExchange.Redis 有3种主要使用机制:

  • 同步 - 适用于操作在方法返回到调用者之前完成(虽然这会阻塞进程,但不会影响其他线程。StackExchange.Redis中的关键思想是它积极共享并发调用者之间的连接)
  • 异步 - 该操作将在将来的某个时间完成,并立即返回 TaskTask<T>,稍后可以执行以下操作:
    • 执行 .Wait() 方法(阻塞当前进程,直到得到返回值)
    • 增加后续回调(ContinueWith in TPL)
    • 调用 await Task(这是一种语言级别的功能,得到响应后立即继续后续代码)
  • 执行且忽略 - 忽略方法的返回值,交给后台执行。

同步用法在上面的示例中展示过了。是最简单的用法,并且不涉及TPL。

对于异步用法,主要区别在于方法带有 Async 后缀,以及使用 await。 例如:

string value = "abcdefg";
await db.StringSetAsync("mykey", value);
...
string value = await db.StringGetAsync("mykey");
Console.WriteLine(value); // writes: "abcdefg"

执行且忽略用法,通过方法的可选参数 CommandFlags 进行设置(默认为无)。 在这种用法中,方法立即返回默认值(返回 String 的方法将返回 null,返回 Int64 的方法将返回 0),且方法将在后台执行,例如用于统计页面访问量:

db.StringIncrement(pageKey, flags: CommandFlags.FireAndForget);

标签:...,订阅,redis,ConnectionMultiplexer,value,db,文档,StackExchange,Redis
来源: https://www.cnblogs.com/liang24/p/13815844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有