Master Redis 消息:订阅通知

作者:微信公众号:【架构师老卢】
9-8 18:15
8

概述:Redis 可以做的不仅仅是存储内容。它还可以发送消息。很酷,对吧?今天,我将向您展示 Redis 如何帮助您快速发送消息。让我们开始吧!什么是 Redis PubSub?听说过 PubSub 吗?它是 Publish/Subscription 的缩写。假设您有两个朋友。一个朋友 (发布者) 说话,另一个 (订阅者) 倾听。Redis PubSub 的工作方式相同。以下是细分:发行人: 发送消息。订户: 侦听消息。渠道: 消息的去向和来源。很简单,对吧?Redis 使这种通话变得简单快捷,非常适合实时聊天。为 PubSub 设置 Redis让我们用一些代码来动手。我们将制作两个简单的应用程序

Redis 可以做的不仅仅是存储内容。它还可以发送消息。很酷,对吧?今天,我将向您展示 Redis 如何帮助您快速发送消息。让我们开始吧!

什么是 Redis PubSub?

听说过 PubSub 吗?它是 Publish/Subscription 的缩写。假设您有两个朋友。一个朋友 (发布者) 说话,另一个 (订阅者) 倾听。Redis PubSub 的工作方式相同。以下是细分:

  • 发行人: 发送消息。
  • 订户: 侦听消息。
  • 渠道: 消息的去向和来源。

很简单,对吧?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” 的通道。很简单,对吧?

创建 Consumer

接下来,我们将创建一个侦听这些消息的使用者应用程序。在这里:

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 PubSub?问得好!以下是一些原因:

  • 实时通信: 非常适合聊天应用程序、实时更新或 Figma 或 Google Docs 等工具。
  • 单纯: Redis 使设置和处理消息变得非常容易。
  • 性能: Redis 速度非常快。无延迟的实时消息传递?是的,拜托了!

Redis 中的事件通知

Redis 还可以在数据发生变化时通知您。想知道值何时更改或过期?Redis 也可以做到这一点。准备?

启用 Keyspace 通知

首先,在 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 使用它来通知我们密钥何时过期。

实际用例

您如何在现实生活中使用它?以下是一些示例:

  • 实时更新: Uber 等应用程序每隔几秒钟更新一次驾驶员的位置。Redis PubSub 可以顺利地处理此问题。
  • 缓存管理: 跟踪缓存条目的过期时间以刷新数据或保留日志。
  • 协作工具: 实时文档编辑,更改会立即显示给每个人。

Redis PubSub 和事件通知是用于实时数据的强大工具。无论您是在构建聊天应用程序还是需要缓存过期警报,Redis 都可以提供帮助。

阅读排行