StackExchange.Redis 系列 9:使用 KEYS, SCAN, FLUSHDB 等命令

  • 本系列博文是“伪”官方文档翻译,并非完全将官方文档进行翻译,而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。

  • 原始文档见此:https://stackexchange.github.io/StackExchange.Redis/

  • 本系列本博文基于 redis 5.0.6,系列中部分博文跟官方文档有出入,有不同见解 / 说明不当的地方,还请大家不吝拍砖。

StackExchange.Redis 面向的是 redis 集群,所以需要直到哪些命令面向 database,哪些命令面向 server。
KEYS, SCAN, FLUSHDB 这些命令都属于服务端命令。

以下命令面向的是单台服务器(包含但不限于)

  • KEYS / SCAN:仅列出当前服务器上的 key;不包括更广逻辑上的 database。

  • FLUSHDB / FLUSHALL:仅移除当前服务器上的 key,不包括更广逻辑上的 database。

  • RANDOMKEY:仅随机选择当前服务器上的 key,不包括更广逻辑上的 database。

  • CLIENT

  • CLUSTER

  • CONFIG / INFO / TIME

  • SLAVEOF

  • SAVE / BGSAVE / LASTSAVE

  • SCRIPT (not to be confused with EVAL / EVALSHA)

  • SHUTDOWN

  • SLOWLOG

  • PUBSUB (not to be confused with PUBLISH / SUBSCRIBE / etc)

  • some DEBUG operations

如何使用这些命令?

eg:使用 IServer 提供的方法,而非 IDatabase

1
2
3
4
5
6
7
8
9
10
// get the target server
var server = conn.GetServer(someServer);

// show all keys in database 0 that include "foo" in their name
foreach(var key in server.Keys(pattern: "*foo*")) {
Console.WriteLine(key);
}

// completely wipe ALL keys from database 0
server.FlushDatabase();
  • 注意,跟 IDatabase API 不同,IServer 的方法提供了可选参数来指定 database,默认情况下是 db0

  • Keys(…) 方法没有提供异步声明,因为在后台处理的时候,系统基于服务版本自行确定最宜使用的方法(如 KEYS 或者 SCAN)。如果可能的话,会使用 SCAN 方法返回一个已经完成分页的 IEnumerable。当 SCAN 不可用的时候,会使用 KEYS ,这会导致 Redis 服务器阻塞。

  • 无论是使用 KEYS 还是 SCAN,都会清除整个 keyspace,应避免在生产环境使用这 2 个命令或者至少应在从库上使用。

获取服务终结点

通过 conn.GetEndPoints()可以列出端点(终结点和你连接时配置的终结点可能不同),之后可以通过遍历 GetServer() 找到所需的服务器(例如,从库信息)。