【问题标题】:Stackexchange Redis - How to get large number of records pagedStackexchange Redis - 如何获取大量记录分页
【发布时间】:2018-02-14 19:20:08
【问题描述】:

有没有办法让结果分页。我正在使用

 Database.HashGetAll(GetKey(key));

来自Stackexchange.Redis .Net Client,但它会引发 OutOfMemory 异常。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    您可以使用HashScan 方法迭代redis 哈希。

    当您遍历结果集时,StackExchange.Redis 将自动调用HSCAN 以根据需要返回更多页的结果。您可以选择使用pageSize 参数来影响每次调用HSCAN 返回的记录数。

    var hashEntries = database.HashScan(key);
    
    foreach (var entry in hashEntries)
    {
        // ...
    }
    

    在迭代期间的任何时候,您都可以获得光标的当前值,这将允许您从同一页结果开始新的迭代。

    ((IScanningCursor) hashEntries).Cursor
    

    请查看http://redis.io/commands/scan,了解有关它如何在后台工作的更多详细信息。

    每次 SCAN 调用返回的元素数

    SCAN 系列函数不保证元素个数 每次调用返回的值都在给定范围内。命令也被允许 返回零元素,客户端不应该考虑 只要返回的游标不为零,迭代就完成了。

    COUNT 选项

    虽然 SCAN 不保证每次迭代返回的元素数量,但可以 使用 COUNT 选项根据经验调整 SCAN 的行为。 基本上用 COUNT 用户指定了应该做的工作量 在每次调用时完成,以便从 收藏。然而,这只是实施的一个提示 一般来说,这是你大多数时候可以期待的 从实施。

    • 默认的 COUNT 值为 10。
    • 在迭代键空间、集合、散列或排序集时,如果没有 MATCH 选项,则大到可以用散列表表示 使用时,服务器通常会返回 count 或比 count 多一点 每个调用的元素。

    【讨论】:

    • HashScan() 的概念令人困惑,无论现有的所有文档如何,仍然知之甚少且过于复杂。我做了一个测试。我将 1164 个条目填充到哈希中,然后运行 ​​hashEntries = database.HashScan(key, "*", 50)。建议,做foreach (var entry in hashEntries) 将在一次通过中迭代 1164 个条目的整个散列。在迭代期间,如果我选择停止迭代并稍后继续,将在我请求的 50 个条目后发出一个新光标。因为我没有问题变得非常简单:1)HashScan(),2)迭代,3)完成!
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2015-03-02
    • 2015-04-17
    相关资源
    最近更新 更多