使用Lua脚本时,HGETALL返回数组而不是散列表[Rails,Redis,Lua]

问题是什么?

通过lua脚本访问包含哈希对象的redis键实际上返回数组而不是哈希。

问题

解决这个问题的最佳时间效率方法是什么?

  • 将值以字符串的形式保存为Ruby哈希,然后使用eval进行转换
  • 将哈希拆分为多个获取,每个获取都有单个值
  • 将值以字符串的形式保存为JSON对象,然后使用oj gem进行加载

问题详情

HMSET

HMSET "[1, 79, 29, 44]" 0 1

Redis-rb gem

当使用redis gem访问键时,它返回哈希,如预期所示。

2.1.3 :001 > require "redis"
require  => true
2.1.3 :002 > r = Redis.new
=> #<Redis client v3.2.1 for redis://127.0.0.1:6379/0>
2.1.3 :003 > r.hgetall("[1, 79, 29, 44]")
=> {"0"=>"1"}
2.1.3 :004 >

Wolverine gem

当使用wolverine使用lua脚本(hmget.lua)访问相同的键时,它实际上返回一个数组。

[1] pry(#<CubosController>)> a = MessagePack.unpack(Wolverine.hmget(["[1, 79, 29, 44]"]))
=> {"[1, 79, 29, 44]"=>["0", "1"]}
[2] pry(#<CubosController>)> a["[1, 79, 29, 44]"].class
=> Array

Redis-db-scripting gem

具有相同问题:

2.1.3 :005 > redis = Redis.new()
=> #<Redis client v3.2.1 for redis://127.0.0.1:6379/0>
2.1.3 :006 > scripts = Redis::Scripting::Module.new(redis,"/Users/rapha/projetos/qlikview/app/wolverine")
=> <Redis::Scripting::Module: 0x3fd69c62aec8    @source_dir="/Users/rapha/projetos/qlikview/app/wolverine" @redis=# <Redis:0x007fad39571730>>
2.1.3 :007 > MessagePack.unpack(scripts.run(:hmget, ["[1, 79, 29, 44]"], []))
=> {"[1, 79, 29, 44]"=>["0", "1"]}

hmget.lua

local data = {}

for _, key in ipairs(KEYS) do
  data[key] = redis.call('HGETALL', key)
end

return cmsgpack.pack(data)

消息压缩/解压缩不是问题,已经测试过。

在Wolverine中打开的问题

https://github.com/Shopify/wolverine/issues/13

已经解决的类似问题

https://github.com/redis/redis-rb/issues/469

点赞