【问题标题】:How can I get all of the sets in redis?如何在 redis 中获取所有集合?
【发布时间】:2011-11-19 17:15:39
【问题描述】:

我知道 KEYS 命令,但它只返回键(我猜是所有类型为 String 的键),显然集合不被视为键。

是否有获取数据库中所有集合的命令?其他数据类型(散列、列表、排序集)呢?

http://redis.io/topics/data-types

【问题讨论】:

  • 参见answer below,了解如何使用SCAN 0 TYPE set(第6 版)或之前版本的等效Lua 脚本进行此操作

标签: redis


【解决方案1】:

我知道 KEYS 命令,但它只返回键(我猜 所有类型为 String 的键),显然集合不是 被认为是键。

无论您的键是什么数据类型,KEYS 命令都会返回结果,因为它会搜索键名。在最低抽象级别,redis 中的每种数据类型都是基于键/值的,其中值可以表示为几种(高级)数据结构(字符串、哈希、列表、集合、排序集)中的一种。您可以看到 KEYS 命令也适用于 examples 中的集合。

是否有获取数据库中所有集合的命令?什么 关于其他数据类型(散列、列表、排序集)?

据我所知,此功能没有专用命令,KEYS 命令应用于数据库的整个数据集。但是有一个TYPE 命令可以确定指定键的数据类型。

【讨论】:

  • 糟糕,我做了keys '*',而不是keys *。我通过 redis-cli 运行它,并试图避免使用 bash(有时我在 bash 中使用 redis-cli keys '*' 或类似方法,而不是使用 redis-cli 的交互模式)。不过感谢您的回答!
【解决方案2】:

答案在当时是正确的,但是 redis 2.8.0 支持这一点 - 查看 SCAN

【讨论】:

  • 如何获取使用 Scan 设置的类型键列表? SSCAN 命令仅在 set 类型的键内迭代
  • 正是我想要的。很高兴你忘记了你给集合起的名字。
【解决方案3】:

在 cli-redis 中你可以尝试做:

KEYS *

【讨论】:

  • 简单 n 直接 n 正确
【解决方案4】:

从 6.0 版开始,您可以使用SCAN 0 TYPE set。见https://redis.io/commands/scan#the-type-option

对于 6.0 之前的版本,您可以使用 Lua 脚本过滤服务器端,从而节省从客户端执行 TYPE 回调的往返时间 (RTT)。

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[3] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * set

脚本的参数是0(numkeys) cursor matchPattern type。例如。 0 0 * set

这里是 Lua 脚本的友好视图:

local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2])
local filtered = {}
for _,key in ipairs(result[2]) do
    if redis.call('TYPE', key).ok == ARGV[3] then
        table.insert(filtered, key)
    end
end
result[2] = filtered
return result

返回值与SCAN相同,只是按类型过滤的键列表。

SCAN一样,需要多次调用,直到返回的光标为零。

这种方法比使用KEYS要好得多,因为它不会长时间阻塞服务器。

Next 是相同的脚本,但带有 COUNT 选项,每次调用可以做更少或更多的工作。计数应大于零。

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[4] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * 100 set

脚本的参数是0(numkeys) cursor matchPattern count type。例如。 0 0 * 100 set

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2021-06-29
    • 2021-07-05
    • 1970-01-01
    • 2022-09-22
    • 2014-03-10
    相关资源
    最近更新 更多