2011-02-25 44 views
9

我使用Redis的作为我的网页缓存,我想存储的ActiveRecord对象直接Redis的,但使用redis-rb我得到一个错误。如何保存轨的ActiveRecord对象的Redis

看来我不能序列,或一些东西。有没有一个lib为我做这个? 难道我必须把它序列化到JSON格式?

哪个序列化格式将是最有效的?

回答

14

Redis存储字符串(以及一些其他字符串数据结构);所以你可以序列化成Redis的值,只要你最终得到一个字符串即可。

JSON可能是开始,因为它是瘦,不是过于脆,有现场升级的模式运作良好,并为现场可读的最佳场所。稍后,您可以根据需要添加更多复杂性来实现您的目标,例如压缩。 #to_json和#from_json已经在ActiveRecord上,如果你想使用JSON(与YAJL或它的流派不应该太慢,相对而言)。#to_xml也存在,如果你进入S & M.

原编组也能正常工作,但偶尔去惊人,错误的(我有封送对象LZO压缩技术,只有在JSON几K后超过2MB。)

如果这真是一个瓶颈,你会想要使用自己的对象和数据模式为自己的目标运行自己的效率测试,例如写入速度,读取速度或存储大小。

+0

谢谢尤里,你真的告诉我我想要知道什么。看来json是我最好的选择...再次感谢! – 2011-02-25 03:57:30

+0

刚才尝试这个,貌似元帅是正确的选择,如果你包括协会。它会恢复正确类型的东西。使用JSON时,关联只会被存储为散列值,因此您尝试使用from_json进行还原时出现错误。 – mahemoff 2012-02-01 19:58:22

+0

http://msgpack.org/也是一个不错的选择。比JSON更小,效率更高。 – 2014-04-25 09:30:16

1
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

似乎JSON是对我来说比较方便,但我会做对元帅方法的性能测试。不管怎么说,还是要谢谢你。 – 2011-02-25 04:00:20

0

您可以将您的模型转换为使用属性方法的哈希,然后用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 
相关问题