【问题标题】:How to get all hashmap match with prefix in Redis?如何在 Redis 中获取所有与前缀匹配的哈希图?
【发布时间】:2020-09-03 13:58:56
【问题描述】:

我有以下格式的redis数据:

HMSET name:1 key "value"
HMSET name:2 key "value2"
HMSET name:3 key "value3"
HMSET name:a key "valuea"

如何获取所有前缀为“name:”的hashmap,结果如下:

name:1 key "value"
name:2 key "value2"
name:3 key "value3"

【问题讨论】:

标签: redis node-redis redis-cluster


【解决方案1】:

您想使用SCAN 而不是KEYS,因为KEYS 可能会阻塞您的服务器太久。

您想按哈希图类型进行过滤。在How can I get all of the sets in redis?中查看更多信息

然后,您想将字段值附加到响应中。为此,您需要Lua Scripting

这个脚本应该让你开始:

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
        local keyWithHash = {}
        keyWithHash[1] = key
        keyWithHash[2] = redis.call('HGETALL', key)
        table.insert(filtered, keyWithHash)
    end
end
result[2] = filtered
return result

如果您使用的是 Redis 6,则可以通过使 SCAN 使用 TYPE 选项来优化它,而不是通过调用 TYPE command 来一一过滤。

用作:

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      local keyWithHash = {}      keyWithHash[1] = key        keyWithHash[2] = redis.call('HGETALL', key)         table.insert(filtered, keyWithHash)     end end result[2] = filtered return result" 0 0 "name:*" hash

预测试:

HMSET name:1 key "value"
HMSET name:2 key "value2"
HMSET name:3 key "value3"
HMSET name:a key "valuea"
SET name:notAhash "asdasd"

测试:

> EVAL "local result ... return result" 0 0 "name:*" hash
1) "0"
2) 1) 1) "name:a"
      2) 1) "key"
         2) "valuea"
   2) 1) "name:3"
      2) 1) "key"
         2) "value3"
   3) 1) "name:2"
      2) 1) "key"
         2) "value2"
   4) 1) "name:1"
      2) 1) "key"
         2) "value"

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2016-11-03
    • 2013-05-17
    • 2015-07-08
    相关资源
    最近更新 更多