【问题标题】:How to iterate over Redis keys to get their values?如何遍历 Redis 键以获取它们的值?
【发布时间】:2018-02-16 01:27:15
【问题描述】:

如何遍历 Redis 中的对象并获取它们的所有值?像这样的:

scan object* hgetall

这应该返回

age 22 password 1234 username Sarah
age 20 password 5678 username Mike

当 Redis 包含这些数据时:

hmset objectSarah age 22 password 1234 username Sarah
hmset objectMike age 20 password 5678 username Mike

谢谢

【问题讨论】:

    标签: redis


    【解决方案1】:

    你不能只用一个命令来做到这一点,你需要一个一个地扫描然后处理结果(即HGETALL他们)。

    但是,您可以将其包装到 Lua 脚本中(请参阅EVAL),该脚本接受当前光标并在将所有内容返回给客户端之前获取数据。即:

    local cur, pat = tonumber(ARGV[1]), ARGV[2]
    local scan = redis.call('SCAN', cur, 'MATCH', pat)
    
    for i, v in ipairs(scan[2]) do
      local data = redis.call('HGETALL', v)
      scan[2][i] = { v, data }
    end
    
    return scan
    

    运行时示例:

    127.0.0.1:6379> hmset objectSarah age 22 password 1234 username Sarah
    OK
    127.0.0.1:6379> hmset objectMike age 20 password 5678 username Mike
    OK
    127.0.0.1:6379> script load "..."
    "d81ace3345591b4fee7f3bf4cf28e7b260b59554"
    127.0.0.1:6379> evalsha d81ace3345591b4fee7f3bf4cf28e7b260b59554 0 0 object*
    1) "0"
    2) 1) 1) "objectSarah"
          2) 1) "age"
             2) "22"
             3) "password"
             4) "1234"
             5) "username"
             6) "Sarah"
       2) 1) "objectMike"
          2) 1) "age"
             2) "20"
             3) "password"
             4) "5678"
             5) "username"
             6) "Mike"
    

    注意事项:

    1. 这实际上是集群安全的,在这里使用以编程方式生成的键名应该没问题。
    2. 小心带有大哈希的HGETALL
    3. 不建议对大型数据集和/或提供快速响应进行扫描

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2021-02-13
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多