Redis 可以做的不仅仅是存储内容。它还可以发送消息。很酷,对吧?今天,我将向您展示 Redis 如何帮助您快速发送消息。让我们开始吧!
听说过 PubSub 吗?它是 Publish/Subscription 的缩写。假设您有两个朋友。一个朋友 (发布者) 说话,另一个 (订阅者) 倾听。Redis PubSub 的工作方式相同。以下是细分:
很简单,对吧?Redis 使这种通话变得简单快捷,非常适合实时聊天。
让我们用一些代码来动手。我们将制作两个简单的应用程序 — 发布者和消费者。
首先,我们将创建发布者。此应用程序将向 Redis 发送消息。下面是一个示例:
using StackExchange.Redis;
using System;
using System.Text.Json;
using System.Threading.Tasks;
public class Program
{
private static async Task Main(string[] args)
{
var connection = await ConnectionMultiplexer.ConnectAsync("localhost:6379");
var subscriber = connection.GetSubscriber();
var channel = "messages";
while (true)
{
Console.Write("Type your message: ");
var text = Console.ReadLine();
if (string.IsNullOrEmpty(text)) continue;
var message = new RedisMessage { Id = Guid.NewGuid(), Text = text };
var serializedMessage = JsonSerializer.Serialize(message);
await subscriber.PublishAsync(channel, serializedMessage);
}
}
public record RedisMessage(Guid Id, string Text);
}
此应用程序连接到 Redis 并等待您键入消息。然后,它将该消息发送到一个名为 “messages” 的通道。很简单,对吧?
接下来,我们将创建一个侦听这些消息的使用者应用程序。在这里:
using StackExchange.Redis;
using System;
using System.Text.Json;
using System.Threading.Tasks;
public class Consumer
{
private static async Task Main(string[] args)
{
var connection = await ConnectionMultiplexer.ConnectAsync("localhost:6379");
var subscriber = connection.GetSubscriber();
var channel = "messages";
await subscriber.SubscribeAsync(channel, (ch, message) =>
{
var redisMessage = JsonSerializer.Deserialize(message);
Console.WriteLine($"Message received: {redisMessage.Text}");
});
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
public record RedisMessage(Guid Id, string Text);
}
此应用程序连接到 Redis 并侦听 “messages” 通道。当它收到一条消息时,它会在屏幕上显示文本。
您可能想知道,“为什么要使用 Redis PubSub?问得好!以下是一些原因:
Redis 还可以在数据发生变化时通知您。想知道值何时更改或过期?Redis 也可以做到这一点。准备?
首先,在 Redis 中打开 keyspace 通知:
CONFIG SET notify-keyspace-events Kx
此命令指示 Redis 通知我们有关关键事件的信息。“K” 表示密钥通知,“x” 表示我们希望收到过期密钥的警报。
现在,让我们将使用者更改为侦听密钥过期:
using StackExchange.Redis;
using System;
using System.Text.Json;
using System.Threading.Tasks;
public class EventConsumer
{
private static async Task Main(string[] args)
{
var connection = await ConnectionMultiplexer.ConnectAsync("localhost:6379");
var subscriber = connection.GetSubscriber();
var channel = "__keyevent@0__:expired";
await subscriber.SubscribeAsync(channel, (ch, message) =>
{
var expiredKey = (string)message;
Console.WriteLine($"Key expired: {expiredKey}");
});
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
此应用程序侦听 __keyevent@0__:expired 频道。Redis 使用它来通知我们密钥何时过期。
您如何在现实生活中使用它?以下是一些示例:
Redis PubSub 和事件通知是用于实时数据的强大工具。无论您是在构建聊天应用程序还是需要缓存过期警报,Redis 都可以提供帮助。