我正在使用StackExchange.Redis NuGet包。
我希望获得在调用redis.GetSubscriber()时创建的连接的客户端ID。此方法返回ISubscriber类型的对象,并创建到redis服务器的新连接。
我在这个对象上找不到任何属性或方法来提供对它使用的连接的客户端id的访问。
我知道我可以将CLIENT ID命令发送到redis,但这并没有帮助,因为似乎没有一种方法可以通过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有人能提出一些建议吗?
发布于 2021-04-06 08:21:21
这是一个非常有趣的问题,特别是:
CLIENT ID操作只存在于Redis5.0以后的,则无法执行CLIENT ID操作。
要查看后者,请考虑下面的跟踪(我在#之后的注释)
> ping # check connection
< +PONG
> client id # check can get client id on vanilla connection
< :5
> subscribe foo # switch to subscriber mode
< *3
< $9
< subscribe
< $3
< 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,以防稍后需要它作为连接握手的一部分。我不反对这样做--它足够便宜,而且我们可以很容易地为所有的连接做到这一点;但是:它确实需要更改库。
我猜这是因为您试图使用CLIENT TRACKING选项实现REDIRECT,因为订阅服务器客户端id没有那么多可供选择的用途。
注意:您可以尝试使用CLIENT LIST进行猜测,但我不建议这样做。
https://stackoverflow.com/questions/66964604
复制相似问题