目前,我正在通过以下操作将数据从活动记录缓存到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。找到这份工作的途径如下:
(只是一个例子)
HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"我的应用程序中的authors表由以下字段组成:id、name、created_at、updated_at
使用hmset的红宝石方式是什么,这样我就可以在redis散列中缓存authors数据了?
发布于 2018-05-05 08:03:00
我不认为你能这样拯救所有的作者。这是因为散列只能为每个键存储一个值。因此,name和created_at不能是键,因为所有作者都需要为这些键存储自己的值,但是您只能使用每个键一次。
如果您使用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命令不接受数组,而是一个简单的属性列表,这就是为什么在第2行中需要将*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"}'
https://stackoverflow.com/questions/50172381
复制相似问题