StackExchange.Redis如何查询所有数据库密钥

时间:2015-02-20 02:31:32

标签: stackexchange.redis

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

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

        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

我会感激任何帮助。

2 个答案:

答案 0 :(得分:5)

首先,你使用的是redis服务器版本?可用的服务器命令因服务器而异,在2.8之前的版本上,必须使用KEYS命令而不是SCAN命令。 KEYS命令因引起严重的性能问题而众所周知,除了奴隶之外,不应该在生产中使用KEYS命令。如果你正在使用< 2.8,是的,我希望SCAN导致超时。

但是,KEYSSCAN最终都表明您没有按预期方式使用redis。您不应该发现自己需要将这些命令用于常规操作。 应该常规使用它们的唯一工具是管理/数据探索工具。并且他们应该理想地针对奴隶,而不是主人。

通常有其他方式可以执行人们倾向于KEYSSADD的任何操作 - 例如,将密钥存储在单个集合中的特定组中({{1}}等)

答案 1 :(得分:0)

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

SetAllObject

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

GetAllObject

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