Как установить данные в хэше Redis с помощью ruby - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я кэширую данные из активной записи в 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, чтобы я мог кэшировать authors данных в хэше redis?

1 Ответ

0 голосов
/ 05 мая 2018

Я не думаю, что вы можете сохранить всех авторов таким образом. Это связано с тем, что хэш может хранить только одно значение для каждого ключа. Таким образом, 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 принимает не массив, а плоский список атрибутов, поэтому во 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"}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...