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

问题描述

我正在使用 StackExchange.Redis NuGet 包。

我想获取调用 i ab x a 1 {'a': {}} pre {'a': {}} 2 {} last {'b': '$'}?????????????????????????????????? i ac x a pre {'a': {'b': '$'}}!!??From the above "last",where comes the **'a':** ???? 2 {'b': '$'} last {'b': '$','c': '$'} {'a': {'b': '$','c': '$'}} 时创建的连接的客户端 ID。此方法返回一个 redis.GetSubscriber() 类型的对象并创建一个到 redis 服务器的新连接。

我在此对象上找不到任何属性方法来提供对其使用的连接的客户端 ID 的访问权限。

我知道我可以将 ISubscriber 命令发送到 redis,但这无济于事,因为似乎没有办法通过 CLIENT ID 对象或任何方式手动发送此命令可从其方法属性访问的对象。

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

ISubscriber

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

解决方法

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

  1. CLIENT ID 操作仅从 Redis 5.0 开始存在
  2. 一旦连接处于订阅者模式,就无法执行 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 猜测,但我不建议这样做。