【问题标题】:Saving a HASH to Redis on a rails app在 Rails 应用程序上将 HASH 保存到 Redis
【发布时间】:2017-02-25 09:15:02
【问题描述】:

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

我正在尝试将哈希保存到 redis 服务器,但是当我检索它时它只是一个字符串 IE。

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

#So collecting the data
@data = $redis.get('data')

这显然是错误的,因为它以字符串形式返回。

我也尝试循环一些结果并使用 hset ie。

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

# errror
# ERR Operation against a key holding the wrong kind of value

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

希望你能给点建议,李

【问题讨论】:

  • 发帖人似乎想要一个 ruby​​ 字典存储为序列化字符串,但在执行 hset 时我得到了同样的错误,即使键是哈希。谁能猜到为什么会这样?
  • 想通了!并不是我在对字符串执行 HSET,而是在我应该使用 HGETALL 的时候对哈希执行 GET。

标签: ruby-on-rails-3 redis


【解决方案1】:

我应该更彻底地阅读 redis 文档。

答案:

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

OUT
data = JSON.parse($redis.get("data"))

【讨论】:

  • 如果你想做的是存储一个序列化的哈希,那很好,但我实际上想要一个 redis 哈希,我也遇到了这个错误。
  • 感谢您指出解决方案。我也没有仔细阅读 redis 文档。该解决方案也可用于各种红宝石对象。 redis doc
【解决方案2】:

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

$redis.mapped_hmset "test", { foo: "bar" }
$redis.hgetall "test" => {"foo"=>"bar"}

【讨论】:

  • 请注意,内部哈希会以字符串形式返回。存储 {:a => 1, :b => {:c => 2}} 将返回为 {"a"=>"1", "b"=>"{:c=>2}"} 此外,您会丢失符号化的键。
  • 聚会有点晚了,但是使用transform_keysdeep_symbolize_keys 你可以将那些去符号化的键重新变成符号化的。
  • 请注意,hash 不会覆盖,但如果存在则合并,所以 [1] pry(main)> RedisClient.mapped_hmset(:test, {foo: 'bar'}) => "OK" [2] pry(main)> RedisClient.mapped_hmset(:test, {bar: 'foo'}) => "OK" [3] pry(main)> RedisClient.hgetall(:test) => {"foo"=>"bar", "bar"=>"foo"}
【解决方案3】:

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

$redis.hmset('user:007', :name, 'Antonio', :busy, 'maybe', :ping, 'pong')

快乐编码。

【讨论】:

  • 谢谢你,祝你编码愉快。
  • hmset如何设置TTL?
  • 喜欢这个? hash = { name: 'Antonio', busy: 'maybe', ping: 'pong' } $redis.hmset('user:007', *hash)
【解决方案4】:

当你使用$redis.set('data', hash) 时,你实际上保存了一个常规的 Redis 字符串,即使你使用了一个哈希变量(它可能被序列化为 Json 字符串,但我真的不确定)。

尝试使用$redis.hset('data', hash)(而不是像您那样循环遍历字段)。

另外一点:你确定你已经完全删除了之前的密钥吗?您是否尝试hset 一个完全不同的键来消除先前字符串键仍然“存在”的选项?

【讨论】:

  • $redis.hset('data', hash),给我错误:参数数量错误(2 对 3)。 hset 将它们设置为单独的。我也试过 $redis.hmset('data', hash) 并得到错误:ERR wrong number of arguments for 'hmset' command
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2015-04-23
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多