带有C#示例的Redis Keyspace通知
#cache #redis #csharp #pubsub

介绍

Redis的关键功能之一是它可以基于其键空间中发生的关键事件触发通知的能力,从而可以实时更新。它可能是构建可扩展可靠的系统必须快速反应数据变化的有用功能。

REDIS配置

我假定REDIS实例已经在本地或其他地方运行,并且Redis CLI访问已可以使用。

默认情况下,键空间事件通知被禁用,为了启用其,我们需要执行以下命令:

config set notify-keyspace-events Kxge$

Kxge$参数中的每个字母代表了不同类型的redis事件,应将其发布给酒吧/子机制:

  • k:字符串命令的键事件(例如设置,get)
  • X:过期事件的键事件(例如,过期的密钥)
  • g:通用命令的键事件(例如,DEL,Ever ever)
  • e:与正在通过eval命令或lua脚本修改的密钥相关事件的事件的关键事件
  • $:通过redis的lrange和ltrim命令收到的字符串命令的键空间事件

这几乎是这样。后来,在C# example部分之后,我们将执行更多的Redis CLI命令来设置和到期。

C#示例

让我们创建一个简单的控制台应用程序,然后安装以下Nuget软件包:

StackExchange.Redis

然后,我们可以创建ConfigurationOptions类的新实例,并将其端点设置为带有地址localhost:6379的单个redis端点。

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        "localhost:6379"
    }
};

我们需要创建一个新的ConnectionMultiplexer实例并获取与指定服务器的pub/sub用户连接。

var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
var subscriber = connectionMultiplexer.GetSubscriber();

现在最有趣的部分。在这里,我们订阅了Redis Keyspace通知。具体而言,它通过使用频道模式中的__keyspace@0__:*前缀。

await subscriber.SubscribeAsync("__keyspace@0__:*", (channel, type) =>
{
    var key = GetKey(channel);

    switch (type)
    {
        case "set":
            Console.WriteLine($"Set: {key}");
            break;
        case "expire":
            Console.WriteLine($"Expire: {key}");
            break;
        case "expired":
            Console.WriteLine($"Expired: {key}");
            break;
    }
});

REDIS订户对象的SubscribeAsync方法用于订阅Keyspace事件,并且它采用委托函数,每当键键事件发生在与订阅模式匹配的键上时,该函数将被调用。

然后,开关语句处理可能发生的每种类型的键空间事件,并将消息写入控制台,指示事件的类型和受事件影响的密钥。在我们的示例中,我们仅捕获3种类型:设置,过期和过期。但是还有更多,您可以在Redis Docs网站上找到完整列表。

要从通道中提取键,我们可以使用类似的方法:

static string GetKey(string channel)
{
    var index = channel.IndexOf(':');

    if (index >= 0 && index < channel.Length - 1)
    {
        return channel[(index + 1)..];
    }

    return channel;
}

最后,让我们添加此:

await subscriber.UnsubscribeAllAsync();
await connectionMultiplexer.DisposeAsync();

在redis订户对象上调用了UnsubscribeAllAsync方法,以取消订阅使用SubscribeAsync方法的所有通道。此方法用于终止订阅并停止聆听事件。

然后在连接的Multiplexer对象上调用DisposeAsync方法以释放Redis Connection使用的任何资源。

奔跑和玩

现在运行控制台应用并执行以下两个redis clu命令:

set mykey 0

该命令用于设置redis键的值。

expire mykey 10

,该

用于为redis键设置过期时间(以秒为单位)。

执行了“到期命令”,REDIS将启动密钥的计时器,10秒后,将自动从数据库中删除密钥。

结果,我们将在输出控制台中看到这一点:

Set: mykey
Expire: mykey
Expired: mykey

实际用途

redis密钥空间通知是可以通过多种方式使用的功能。以下是Redis Keyspace通知的一些实际用途:

  • 缓存无效:每当更新或删除相应的键时,它可用于使缓存数据无效。
  • 实时分析:每当将新数据添加到数据库中时,它可用于触发实时分析和报告。

,但是在评论中让我知道如何使用redis键通知。

链接