我试图找到一些遵循模式的密钥,但我需要所有相关的密钥,而不仅仅是特定服务器中的密钥。
到目前为止,我正在尝试使用文档示例访问特定的服务器,但它不起作用。
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
会导致超时。
然而,最终SCAN
和KEYS
都表明您没有按预期方式使用redis。您不应该发现自己需要在常规操作中使用这些命令。应该常规使用的唯一工具是管理/数据探索工具。理想情况下,他们应该以奴隶为目标,而不是以主人为目标。
通常有其他方法可以做人们想要的SCAN
和KEYS
的任何事情,例如,将密钥存储在一个特定的组中(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;
}
}