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

我将感谢任何帮助。

首先,您使用的redis服务器版本是什么?可用的服务器命令因服务器而异,在2.8之前的版本上,必须使用KEYS命令而不是SCAN命令。众所周知,KEYS命令会导致严重的性能问题,因此不应在生产中使用,除非可能在从属设备上使用。如果您正在使用<2.8,是的,我希望KEYS会导致超时。

然而,最终SCANKEYS都表明您没有按预期方式使用redis。您不应该发现自己需要在常规操作中使用这些命令。应该常规使用的唯一工具是管理/数据探索工具。理想情况下,他们应该以奴隶为目标,而不是以主人为目标。

通常有其他方法可以做人们想要的SCANKEYS的任何事情,例如,将密钥存储在一个特定的组中(SADD等)

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

设置所有对象

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

GetAllObject

JsonConvert.DeserializeObject<List<TEntity>>(await server.StringGetAsync("AllKeys")).ToList();
public record struct SearchResult (string Input, string Output, bool IsAckNack);
public IEnumerable<SearchResult> Search(string id)
{
    var connection = ConnectionMultiplexer.Connect(new ConfigurationOptions
    {
        EndPoints = { { DemoSettings.CustomerRedisCache.Url, DemoSettings.CustomerRedisCache.Port } },
        Password = DemoSettings.CustomerRedisCache.Password
    });
    var cadena = "cust:" + id.Replace(' ', ':')+"*";
    var server = connection.GetServer(host: DemoSettings.CustomerRedisCache.Url, port: DemoSettings.CustomerRedisCache.Port);
    var keys = server.Keys(pattern: cadena);
    var db = connection.GetDatabase();
    var results = new List<SearchResult>();
    Console.WriteLine($"Found {keys.Count()} keys matching {id}");
    var counter = 0;
    foreach (var key in keys)
    {
        var item = db.HashGetAll(key);
        var result = new SearchResult();
        foreach (var field in item)
        {
            result = (string)field.Name switch
            {
                "input" => result with { Input = field.Value },
                "output" => result with { Output = field.Value },
                "ack" or "nack" => result with { IsAckNack = true, Output = field.Value.ToString().FormatJson()},
                _ => result
            };
        }
        counter++;
        if(counter > 250){
            yield break;
        }
        yield return result;
    }
}

最新更新