如何将Rails的ActiveRecord对象保存到Redis中

14
我正在使用redis作为我的Web缓存,我想直接将那些activerecord对象存储到redis中,但是使用redis-rb时出现了错误。
似乎我无法对其进行序列化或某种操作。有没有库可以帮我做这个?
我必须将其序列化为JSON格式吗?
哪种序列化格式最有效?
3个回答

16

Redis存储字符串(以及一些其他的字符串数据结构);因此,只要最终得到一个字符串,您可以以任何方式将其序列化为Redis值。

JSON可能是最好的起点,因为它很简洁,不太脆弱,在现场升级模式下工作良好,并且可在原地阅读。稍后,您可以添加更多复杂性以满足您的目标,例如压缩。如果要使用JSON(使用YAJL或类似工具,相对而言速度不应过慢),则ActiveRecord上已经有了#to_json和#from_json。如果您喜欢S&M,#to_xml也可以使用。

原始编组也可以使用,但有时会出现可怕的错误(我曾经遇到过编组对象在LZO压缩后超过2MB,而在JSON中只有几K)。

如果这真的是您的瓶颈,您将希望针对您的目标运行自己的效率测试,例如写入速度、读取速度或存储大小,使用您自己的对象和数据模式。


谢谢Yuri,你真的告诉了我想知道的内容。看起来JSON是我在这里最好的选择...再次感谢! - Mike Li
现在只是尝试一下,看起来如果要包含关联,Marshal 是正确的选择。它会以正确的类型恢复事物。使用 JSON 时,关联仅存储为哈希,因此尝试使用 from_json 进行还原时会出现错误。 - mahemoff

3
您可以使用attributes方法将模型转换为哈希,然后使用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

2
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

似乎对我来说JSON更方便,但我会对Marshal方法进行性能测试。无论如何,谢谢。 - Mike Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接