0

StackExchange.Redis NuGet 包尚不支持 Redis 6客户端缓存功能,但似乎可以手动启用此功能。

我无法成功接收预期的失效消息。

在下面的示例代码中,建立了三个连接。

第一个连接用于订阅__redis__:invalidate接收到的失效消息。

另外两个启用了客户端跟踪,该REDIRECT选项用于将失效消息重定向到第一个连接。这是为了复制 RESP2 所需的协议。假设(并且未经我确认)StackExchange.Redis使用默认协议 RESP2 启动连接。

然后在两个客户端连接上设置密钥,以便 redis 服务器可以跟踪两者的密钥并发送失效消息。

最后,无限循环a每秒更新 ket。第一个连接订阅了__redis__:invalidate频道,是其他两个客户端的重定向源。预计OnMessage将调用处理程序并将无效消息打印到控制台,但是,这永远不会发生。

// connection 1 - used to receive invalidation messages
var redis1 = ConnectionMultiplexer.Connect("localhost:6379", Console.Out);
var db1 = redis1.GetDatabase();
var clientId1 = db1.Execute("CLIENT", "ID");

// connection 2 - used to test client tracking
var redis2 = ConnectionMultiplexer.Connect("localhost:6379", Console.Out);
var db2 = redis2.GetDatabase();
var clientId2 = db2.Execute("CLIENT", "ID");

// connection 3 - used to test client tracking
var redis3 = ConnectionMultiplexer.Connect("localhost:6379", Console.Out);
var db3 = redis2.GetDatabase();
var clientId3 = db2.Execute("CLIENT", "ID");

// subsribe to invalidation messages
redis1.GetSubscriber().Subscribe("__redis__:invalidate").OnMessage(message =>
{
    Console.WriteLine($"__redis__:invalidate: {message}");
});

// enable client tracking
Console.Write("db2 tracking: ");
Console.WriteLine(await db2.ExecuteAsync("CLIENT", "TRACKING", "ON", "REDIRECT", (string)clientId1));

Console.Write("db3 tracking: ");
Console.WriteLine(await db3.ExecuteAsync("CLIENT", "TRACKING", "ON", "REDIRECT", (string)clientId1));

// register keys to enable tracking
await db2.StringSetAsync("a", "Hi");
await db3.StringSetAsync("a", "Hey");

// test client tracking by updating of the keys
// it is expected that messages will be published by the server to the `__redis__:invalidate` channel
// the subscriber handler above, should print the invalidation message to the console
int i = 0;
while (!stoppingToken.IsCancellationRequested)
{
    db2.StringSet("a", $"A{i++}");
    Console.WriteLine(db3.StringGet("a"));

    //_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
    await Task.Delay(1000, stoppingToken);
}

有没有人知道如何使用 StackExchange.Redis 正确使用此功能?

更新

看起来 StackExchange.Redis 实际上创建了两个连接:一个用于数据库,一个用于订阅者。

因此,var clientId1 = db1.Execute("CLIENT", "ID");获取数据库连接的客户端 ID,而不是订阅者连接。

这意味着db2.ExecuteAsync("CLIENT", "TRACKING", "ON", "REDIRECT", (string)clientId1)正在设置重定向到不正确的连接。

我还没有找到一种以编程方式获取订阅者的客户端 ID 的方法......

4

0 回答 0