问题描述
我正在使用StackExchange.Redis(2.1.58),我通过使用游标写以下代码。
Dictionary<string,string> keyResult = new Dictionary<string,string>();
var Server = Connection.GetServer(Connection.GetEndPoints()[0]);
long current_cursor = 0;
int next_cursor =-1;
long page_size = 10;
while(next_cursor!=0)
{
var allkeys = Server.Keys(RedisCache.Database,argKeyPattern,10,next_cursor==-1 ? 0 : next_cursor);
var cursor = ((StackExchange.Redis.IScanningCursor)allkeys);
foreach (var key in allkeys)
{
if (current_cursor == cursor.Cursor)
{
keyResult.Add(key,RedisCache.StringGet(key));
}
else
{
next_cursor = Convert.ToInt32(cursor.Cursor);
current_cursor = next_cursor;
break;
}
}
}
此代码可以正常工作,我的问题是还有其他方法可以更高效地从Redis批量读取密钥吗? 谢谢!!
解决方法
Keys(...)方法值得特别提及:它不具有* Async对应项,这是不寻常的。原因是在幕后,系统将确定最适合使用的方法(KEYS vs SCAN,基于服务器版本),并在可能的情况下使用SCAN方法将IEnumerable交给您,该IEnumerable可以完成所有内部分页-因此您无需查看游标操作的实现详细信息。如果SCAN不可用,它将使用KEYS,这可能会导致服务器阻塞。
从第一眼看,应该避免使用KEYS
命令。但是,如果命令可用,该库已通过使用SCAN
为您解决了该问题。所以我认为你在这里很好。
如果SCAN命令不可用,那么Keys()
将退回到使用KEYS
命令
SCAN
命令在2.8 ++版中可用