在rails应用程序上将HASH保存到Redis

Lee*_*Lee 27 redis ruby-on-rails-3

我刚刚开始使用Redis with Rails,所以这可能是一个愚蠢的问题.

我试图将哈希值保存到redis服务器但是当我检索它时它只是一个字符串IE.

hash = {"field" => "value", "field2" => "value2"}
$redis.set('data', hash)

#So collecting the data
@data = $redis.get('data')
Run Code Online (Sandbox Code Playgroud)

这显然是错误的,因为它作为一个字符串返回.

我也试过循环一些结果并使用hset即.

@data.each do |d|
  $redis.hset('data', d.field, d.value)
end

# errror
# ERR Operation against a key holding the wrong kind of value
Run Code Online (Sandbox Code Playgroud)

不知道去哪里.我删除了密钥$ redis.del('data')以确保不是问题.

希望你能指教,李

Lee*_*Lee 55

我应该更全面地阅读redis文档.

回答:

IN
$redis.set 'data', hash.to_json

OUT
data = JSON.parse($redis.get("data"))
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要做的是存储序列化哈希,那很好,但我实际上想要一个redis哈希,我也得到了这个错误. (6认同)

小智 47

redis gem会像这样重新映射你的哈希:

$redis.mapped_hmset "test", { foo: "bar" }
$redis.hgetall "test" => {"foo"=>"bar"}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,内部哈希作为字符串返回.存储`{:a => 1,:b => {:c => 2}}`返回为`{"a"=>"1","b"=>"{:c => 2}"而且,你失去了符号化的键. (5认同)
  • 派对有点晚了,但是使用`transform_keys`或`deep_symbolize_keys`你可以将那些去符号化的键转回符号化. (4认同)

小智 10

为了在redis中保存哈希.您必须将密钥作为第一个参数传递,然后下一个参数必须是hmset方法上的键和值.

$redis.hmset('user:007', :name, 'Antonio', :busy, 'maybe', :ping, 'pong')
Run Code Online (Sandbox Code Playgroud)

快乐的编码.