【译】StackExchange.Redis中文文档(一)基础
作者:互联网
基础用法
StackExchange.Redis
最核心的对象是 StackExchange.Redis.ConnectionMultiplexer
。ConnectionMultiplexer
被设计成可在多个调用之间共享使用。不需要为每个操作创建一个 ConnectionMultiplexer
,它是完全线程安全的。可以通过使用 ConnectionMultiplexer.Connect
或 ConnectionMultiplexer.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中的关键思想是它积极共享并发调用者之间的连接)
- 异步 - 该操作将在将来的某个时间完成,并立即返回
Task
或Task<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