目前,我通过执行以下操作将数据从活动记录缓存到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
所以目前我使用基本的set
和get
来缓存和读取redis中的数据。
我想使用hmset
而不是set
。 redis的工作方式如下:
(仅举例)
HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"
我的应用中的作者表包含以下字段:id
,name
,created_at
,updated_at
使用hmset
的ruby方法是什么,以便我可以在redis哈希中缓存authors
数据?
答案 0 :(得分:0)
我认为你不能以这种方式保存所有作者。这是因为哈希只能为每个键存储一个值。因此name
和created_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"}'