如何使用ruby在redis哈希中设置数据

时间:2018-05-04 10:04:55

标签: ruby redis

目前,我通过执行以下操作将数据从活动记录缓存到redis:

redis.rb

$redis = Redis::Namespace.new("bookstore", :redis => Redis.new)

authors_helper.rb

def fetch_authors
    authors = $redis.get('authors')
    if authors.nil?
      authors = Author.all.to_json
      $redis.set("authors", authors).to_json
      $redis.expire("authors", 5.hour.to_i)
    end
    JSON.load authors
end

所以目前我使用基本的setget来缓存和读取redis中的数据。

我想使用hmset而不是set。 redis的工作方式如下:

(仅举例)

HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"

我的应用中的作者表包含以下字段:idnamecreated_atupdated_at

使用hmset的ruby方法是什么,以便我可以在redis哈希中缓存authors数据?

1 个答案:

答案 0 :(得分:0)

我认为你不能以这种方式保存所有作者。这是因为哈希只能为每个键存储一个值。因此namecreated_at不能成为键,因为所有作者都需要为这些键存储自己的值,但您只能使用每个键一次。

如果您正在使用Ruby on Rails,则首选使用Rails.cache - 这样您就不必担心Rails将对象存储在Redis中的方式。

但是,如果您出于某种原因想要使用hmset,我相信您可以做的最好是:

authors = Author.all.flat_map { |author| [author.id.to_s, author.attributes.to_json] } $redis.hmset("authors", *authors_data)

第一行将返回如下内容:

['1', '{"name": "Mary Jones", "email": "m@example.com"}', '2', '{"name": "Another name", "email": "e@example.com"']

hmset命令不接受数组,而是一个扁平的属性列表,这就是为什么在第二行需要将*authors_data传递给函数。

然后,在内部看起来像这样:

{ '1' => '{"name": "Mary Jones", "email": "m@example.com"}', '2' => '{"name": "Another name", "email": "e@example.com"' }

稍后您可以执行$redis.hmget("authors", '1'),它将返回字符串'{"name": "Mary Jones", "email": "m@example.com"}'