如何获取 ISubscriber 连接的客户端 ID?

How do I get the client id for the ISubscriber connection?

我正在使用 StackExchange.Redis NuGet 包。

我想获取调用 redis.GetSubscriber() 时创建的连接的客户端 ID。此方法 returns 一个 ISubscriber 类型的对象并创建一个到 redis 服务器的新连接。

我在这个对象上找不到任何属性或方法来访问它所使用的连接的客户端 ID。

我知道我可以向 redis 发送 CLIENT ID 命令,但这没有帮助,因为似乎没有办法通过 ISubscriber 对象手动发送此命令或通过任何可从其方法和属性访问的对象。

我知道我可以调用 redis.GetDatabase(),然后调用 运行 db.Execute("CLIENT", "ID"),但是 GetDatabase() 创建了一个新连接,返回的客户端 ID 不是ISubscriber 对象正在使用一个。

var redis = ConnectionMultiplexer.Connect("localhost:6379");

// This returns an ISubscriber object and creates a new connection
var subscriber = redis.GetSubscriber(); // I want the client id for this connection

// This returns an IDatabase object and also creates a new connection
var db = redis .GetDatabase();
var dbClientId = invalidatorDb.Execute("CLIENT", "ID"); // not the client id I want

有没有人可以提供一些建议?

这是一个很有趣的问题;特别是:

  1. CLIENT ID 操作只存在于 Redis 5.0 之后
  2. 一旦连接处于订阅者模式
  3. CLIENT ID操作就无法执行

要查看后者,请考虑以下跟踪(在 # 之后加上我的评论)

> ping # check connection
< +PONG

> client id # check can get client id on vanilla connection
< :5

> subscribe foo # switch to subscriber mode
< *3
< 
< subscribe
< 
< foo
< :1

> client id # check can get client id on subscriber connection
< -ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context

这意味着要获得订阅者连接的 CLIENT ID,我们需要更改库以在成为订阅者之前比您有权访问的更早地在管道中发出该命令。实际上,我们需要发出一个推测性的 CLIENT ID 以防我们稍后需要它 作为连接握手的一部分。我并不反对——它足够便宜,而且我们可以很容易地为所有连接做到这一点;但是:它确实需要库更改。

猜测这是因为你试图用REDIRECT选项实现CLIENT TRACKING,因为没有那么多 订阅者客户端 ID 的替代用途。

注意:您可以尝试用CLIENT LIST猜测,但我不推荐这样做。