StackExchange使用笔记(二)

206 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

1.使用发布订阅

Redis另一个常用的功能是作为发布/订阅消息的分发工具,在连接失败时,ConnectionMultiplexer 会处理所有的订阅细节。

ISubscriber sub = redis.GetSubscriber();

GetSubscriber 返回一个不需要存储的对象。 发布/订阅API没有数据库的概念,但正如之前所提到的,我们可以提供一个异步状态(async-state)。注意:所有的订阅都是全局的。它们不局限于 ISubscriber 的生命周期。发布订阅功能在Redis中叫做通道”channels”

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

可以单独的发布一个消息到通道中:

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

会将”hello”(实时的)发布到订阅了该消息的控制台中。正如前面所提到的,通道名称和消息都可以使用字节类型。

2.访问独立的服务器

出于维护为目的,有时候需要发出特定于某个服务器的命令:

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

GetServer 方法接受一个 EndPoint 对象或服务器端有唯一标识的键值对对象。和之前一样,GetServer 方法返回一个不需要存储的廉价对象。并且异步状态(async-state)是可被选择指定的。注意:可用的终结点的集合也是可用的:

EndPoint[] endpoints = redis.GetEndPoints();

来自 IServer 的服务器端命令]都是可用的;例如:

DateTime lastSave = server.LastSave();ClientInfo[] clients = server.ClientList();
3.同步和异步

在StackExchange.Redis中,有3个主要的使用机制:

  • 同步 - 在操作完成之前方法会返回给调用者(尽管这可能会阻塞调用者,但是决不会阻塞其他线程;StackExchange.Redis的关键就是它积极共享并发调用方之间的连接

  • 异步 - 操作将在未来的某个时间完成,并且以 Task 或者 Task 类型立即返回;可以用以下方式实现

    • 使用 Wait 方法 (阻塞当前线程直到响应可用)
    • 使用 ContinueWith 方法(添加一个延续性的回调函数)
    • 使用 await 运算符 (这是一个简化之后的语言级功能)
  • 即发即弃 - 对返回值不做处理并且忽略响应

看到了同步使用的方法,最简单的使用不涉及TPL,对于异步使用,关键的区别是方法后缀 Async,并且使用 awiat 运算符。

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

在所有的方法中,使用即发即弃访问是通过可选参数 CommandFlags flags (默认是传入该参数)来实现的。这样使用方法会立即返回默认值(因此通常返回一个字符串的方法会一直返回 null,而返回一个 Int64 方法会一直返回0)。操作会在后台继续执行。页面点击率统计:

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