как сохранить объект activerecord рельсов в redis - PullRequest
9 голосов
/ 25 февраля 2011

Я использую redis в качестве веб-кэша и хочу сохранить эти объекты activerecord непосредственно в redis, но, используя redis-rb , я получаю сообщение об ошибке.

Кажется, я не могу сериализовать это или что-то еще. Есть ли библиотека, чтобы сделать это для меня? Я должен сериализовать его в формат JSON?

Какой формат сериализации будет наиболее эффективным?

Ответы [ 3 ]

14 голосов
/ 25 февраля 2011

Redis хранит строки (и несколько других структур данных строк); так что вы можете сериализовать значения Redis так, как вам нравится, до тех пор, пока вы не получите строку.

JSON - это, пожалуй, лучшее место для начала, так как он скудный, не слишком хрупкий, хорошо работает с шаблонами обновления в реальном времени и легко читается на месте. Позже вы можете добавить больше сложности для достижения ваших целей, например, сжатия. #to_json и #from_json уже включены в ActiveRecord, если вы хотите использовать JSON (с YAJL или его аналогом, который не должен быть слишком медленным, условно говоря). #to_xml также есть, если вы в S & M.

Необработанный маршалинг также может работать, но иногда идет ужасно неправильно (у меня маршалированные объекты превышают 2 МБ после сжатия LZO, которые были только несколько K в JSON.)

Если это действительно узкое место для вас, вы захотите запустить свои собственные тесты эффективности для ваших целей, например, скорости записи, скорости чтения или размера хранилища, с вашими собственными объектами и шаблонами данных.

1 голос
/ 25 февраля 2011
def self.set(friend_list, player_id)
 redis.set("friend_list_#{player_id}", Marshal.dump(friend_list)) == 'OK' ? friend_list : nil
end

def self.get(player_id)
  friend_list = redis.get("friend_list_#{player_id}")
  Marshal.load(friend_list) if friend_list
end
0 голосов
/ 14 ноября 2013

Вы можете преобразовать вашу модель в хеш, используя метод атрибутов, а затем сохранить ее с помощью mapped_hmset

def redis_set()
  redis.mapped_hmset("namespace:modelName:#{self.id}", self.attributes)
end

def redis_get(id)
  redis.hgetall("namespace:modelName:#{id}")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...