【问题标题】:redis hmget with wildcard fields带有通配符字段的 redis hmget
【发布时间】:2016-01-19 14:11:53
【问题描述】:

我在 redis 中有一个哈希集,如下所示。

"abcd" : {
    "rec.number.984567": "value1",
    "rec.number.973956": "value2",
    "rec.number.990024": "value3",
    "rec.number.910842": "value4",
    "rec.number.910856": "...",
    "other.abcd.efgh": "some value",
    "other.xyza.blah": "some other value"
    "..." : "...",
    "..." : "...",
    "..." : "...",
    "..." : "..."
}

如果我调用 hgetall abcd,它会给我哈希中的所有字段。我的目标是只获取以“rec.number”开头的哈希集字段。当我打电话时

  redis-cli hmget "abcd" "rec.number*", 

它给了我这样的结果

1)

有没有办法只为那些以我预期的模式开头的键检索数据?我只想检索那些键,因为我的数据集包含许多其他不相关的字段。

【问题讨论】:

标签: redis redis-cli


【解决方案1】:

HMGET 不支持字段名称中的通配符。您可以为此使用HSCAN

HSCAN abcd 0 MATCH rec.number*

更多关于SCAN函数在official docs中。

LUA方式

此脚本在 LUA 脚本中执行此操作:

local rawData = redis.call('HGETALL', KEYS[1]);
local ret = {};

for idx = 1, #rawData, 2 do
    if string.match(rawData[idx], ARGV[1]) then
       hashData[rawData[idx]] = rawData[idx + 1];
    end 
end

关于在 Redis 中使用 redis-cli和 LUA 的精彩介绍可以在 A Guide for Redis Users 中找到。

【讨论】:

  • 在 Lua 脚本中,您实际上也应该使用 HSCAN。如果 Hash 足够大/RAM 很紧,这将减少 Lua 引擎的堆。
猜你喜欢
  • 2012-01-04
  • 2015-06-18
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多