我刚接触redis,所以我肯定做错了什么:
我已经在Azure Redis中存储了大约16,000个键/值。
我使用以下代码编写键/值
foreach (var worksheet in wksList)
{
var wksYYMM = string.Format("{0}{1:00}", worksheet.ReviewDt.Year, worksheet.ReviewDt.Month);
var wksKey = string.Format("{0}:{1}:{2}", provCode, wksYYMM, worksheet.AcctNbr);
string jsonStr = JsonConvert.SerializeObject( MakeWsListDto(worksheet, provCoderList, rvrList));
cache.StringSet(wksKey, jsonStr);
}所以我的密钥是这样的:"AP:201401:AZ5798BK“
当我尝试这样的查找时:
var keys = server.Keys(pattern: "AP:201401:*"); // returns in milliseconds
var keyAry = keys.ToArray(); // returns in over one minute
(note: this returns 12 keys)返回密钥需要1分12秒。一旦我有了密钥,就需要几毫秒来检索这些密钥的值。如果我迭代键的值并返回这些值,我会得到类似的结果。我做了一个ToArray()来隔离这个问题。
如果我在redis-cli.exe中尝试同样的查询,它会在毫秒内返回。
我是否错误地使用了此命令?
发布于 2014-10-18 21:17:04
server.Keys根据服务器版本自动在KEYS和首选SCAN之间进行选择。我怀疑所发生的情况是,您使用的SCAN页面大小太小。页面大小有一个可选参数。尝试指定比缺省值大得多的值-数百、数千等。如果未指定,页面大小将使用Redis SCAN的缺省值10,这可能会导致需要进行大量往返。
发布于 2014-10-18 19:50:07
不要使用KEYS -这是一个阻塞命令,它会使您的Redis服务器在运行时无法供其他请求使用。引用自command's documentation
Warning:将KEYS视为仅应在生产环境中极其小心地使用的命令。在对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用键。如果您正在寻找一种在键空间的子集中查找键的方法,请考虑使用SCAN或sets。
如果你仔细阅读了警告,你会注意到段落末尾的推荐方法,即使用SCAN或Redis的集合。扫描是非阻塞的,但由于您的问题表明您对性能感兴趣,因此我建议使用sets。
我们的想法是维护一个Redis集合,其中包含与该“模式”相关联的所有键名,因此在您的示例中,您必须在调用cache.SetString之后执行StackExchange.Redis-等同于SADD AP:201401 AP:201401:AZ5798BK,例如:
cache.SetAdd(wksYYMM, wksKey);免责声明:我不是C#程序员,也不太熟悉StackExchange.Redis (对不起,Marc;)
现在,不使用密钥或扫描来获取密钥,只需执行SMEMBERS AP:201401或可能:
var keys = cache.Members(wksYYMM);Bonus:由于您实际上对这些键的值感兴趣,因此可以使用Redis的Lua脚本根据集合的成员来获取键值,或者直接使用SORT。
纯Redis:
SORT AP:201401 BY nosort GET *`C#和StackExchange.Redis:
vals = cache.Sort(wksYYMM, by = "nosort", get = "*");https://stackoverflow.com/questions/26438736
复制相似问题