【问题标题】:Is there a method to use HSCAN (in JEDIS) to retrieve keys without values?有没有一种方法可以使用 HSCAN(在 JEDIS 中)来检索没有值的键?
【发布时间】:2019-09-13 20:03:12
【问题描述】:

我正在使用 redis(使用 Java Redis),我想使用 HASH,其中包含很多键和每个键中的一些数据(二进制存储) 我想通过地图的键进行迭代,同时不阻塞服务器;因为很多进程访问这个服务器。

因此,我不想使用 HKEYS 命令。
我想使用 HSCAN 命令或类似的方法。因为我只想要这一步操作中的密钥。

但正如文档所述,HSCAN 方法返回:
- 光标
- 一对键值对数组
(见scanhscan(信息不多,参考最后一个链接))

正如我所说,我只想收到钥匙;不是价值观。但是 HSCAN 方法同时返回,我担心它会损害服务器和我的应用程序的性能。

我一直在搜索文档和论坛,但没有找到任何回复。但是如果有人知道更好,请告诉我。

知道 SCAN 方法可以像我想要的那样工作,但 HSCAN 不能......想知道为什么。

谢谢

【问题讨论】:

    标签: hash redis jedis


    【解决方案1】:

    虽然HSCAN 确实在哈希中返回字段-值对,但您可以转换输出以使用服务器端 Lua 脚本过滤值(有关详细信息,请参阅EVAL)。这将减少网络使用和客户端负载,但代价是使服务器(稍微)更难工作。

    以下脚本提供了一种可能的实现方式:

    local key = KEYS[1]
    local cursor = ARGV[1]
    local res = redis.call('HSCAN', key, cursor)
    local rep = { res[1], {} }
    for i=1, #res[2], 2 do
      table.insert(rep[2], res[2][i])
    end
    return rep
    

    【讨论】:

    • 好的,我不知道 lua,但我认为您可以通过使用光标和键数组创建新结果来过滤响应。不应该是 table.insert(rep[2], res[2][i][0]) 或类似只有键?
    • Lua (我认为)易于阅读,并且您正确理解了其中的大部分内容。请注意, res[2] 是来自 Hash 的交替字段和值的数组。循环从索引 1 开始(Lua 基于 1)并以步长 2 进行迭代。这导致仅将字段名称复制到 rep(ly)。顺便说一句 - 我测试了 sn-p 并且它似乎工作正常;)
    • 谢谢,我试试。再见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2020-03-24
    • 2020-03-01
    • 2023-02-13
    • 2022-11-13
    相关资源
    最近更新 更多