首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得ISubscriber连接的客户端id?

如何获得ISubscriber连接的客户端id?
EN

Stack Overflow用户
提问于 2021-04-06 07:44:50
回答 1查看 502关注 0票数 2

我正在使用StackExchange.Redis NuGet包。

我希望获得在调用redis.GetSubscriber()时创建的连接的客户端ID。此方法返回ISubscriber类型的对象,并创建到redis服务器的新连接。

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

我知道我可以将CLIENT ID命令发送到redis,但这并没有帮助,因为似乎没有一种方法可以通过ISubscriber对象或通过它的方法和属性访问的任何对象手动发送该命令。

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

代码语言:javascript
复制
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

有人能提出一些建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-06 08:21:21

这是一个非常有趣的问题,特别是:

  1. CLIENT ID操作只存在于Redis5.0以后的
  2. ,一旦连接处于订阅者模式

,则无法执行CLIENT ID操作。

要查看后者,请考虑下面的跟踪(我在#之后的注释)

代码语言:javascript
复制
> 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进行猜测,但我不建议这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66964604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档