数据库
首页 > 数据库> > 【译】StackExchange.Redis中文文档(一)基础

【译】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 数据库非常简单:

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种主要使用机制:

同步用法在上面的示例中展示过了。是最简单的用法,并且不涉及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