使用堆栈交换Redis客户端批量读取所有密钥

问题描述

我正在使用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批量读取密钥吗? 谢谢!!

解决方法

documentation

Keys(...)方法值得特别提及:它不具有* Async对应项,这是不寻常的。原因是在幕后,系统将确定最适合使用的方法(KEYS vs SCAN,基于服务器版本),并在可能的情况下使用SCAN方法将IEnumerable交给您,该IEnumerable可以完成所有内部分页-因此您无需查看游标操作的实现详细信息。如果SCAN不可用,它将使用KEYS,这可能会导致服务器阻塞。

从第一眼看,应该避免使用KEYS命令。但是,如果命令可用,该库已通过使用SCAN为您解决了该问题。所以我认为你在这里很好。

如果SCAN命令不可用,那么Keys()将退回到使用KEYS命令

SCAN命令在2.8 ++版中可用

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...