StackExchange.Redis 如何查询所有的db Key

StackExchange.Redis how to query all db Keys

我试图找到一些遵循某种模式的密钥,但我需要所有相关的密钥,而不仅仅是特定服务器中的密钥。

到目前为止,我一直在尝试使用文档示例访问特定服务器,但它不起作用。

        var connection = ConnectionMultiplexer.Connect(new ConfigurationOptions
        {
            EndPoints = { { DemoSettings.CustomerRedisCache.Url, DemoSettings.CustomerRedisCache.Port } },
            Password = DemoSettings.CustomerRedisCache.Password
        });

        var server = connection.GetServer(host: DemoSettings.CustomerRedisCache.Url, 
                                          port: DemoSettings.CustomerRedisCache.Port);
        var cadena = "cust:" + data.SearchString.Replace(' ', ':')+"*";
        var valores = server.Keys(pattern: cadena);

最后一行总是因为超时而失败:S

如有任何帮助,我将不胜感激。

首先,您使用的是什么版本的redis服务器?可用的服务器命令因服务器而异,在 2.8 之前的版本上,必须使用 KEYS 命令而不是 SCAN 命令。 KEYS 命令以导致重大性能问题而闻名,不应该在生产中使用,除非可能在从站上使用。如果您使用的是 < 2.8,是的,我希望 KEYS 会导致超时。

但是,最终 SCANKEYS 都表明您没有按预期方式使用 Redis。您永远不会发现自己需要使用这些命令进行常规操作。 应该 经常使用的唯一工具是管理/数据探索工具。 他们理想情况下应该针对奴隶,而不是主人。

通常有其他方法可以做人们倾向于 SCANKEYS 的任何事情 - 例如,通过将密钥存储在一个特定组中的单个集合中(SADD等)

如果您需要所有KEY*,将它们保留在一个值中会提高速度。您可以将对象保留在 AllKeys 下以显示所有 Keys。

SetAllObject

server.StringSetAsync("AllKeys", JsonConvert.SerializeObject(obj));

GetAllObject

JsonConvert.DeserializeObject<List<TEntity>>(await server.StringGetAsync("AllKeys")).ToList();