我正在设置一个redis商店,其中我的会话user_id值存储在cookie中,其余的模型数据(first_name,last_name,username等)存储在redis中。我是Redis的新手,我不知道如何存储模型数据。
我有两个问题:
存储它的最佳方法是什么,我应该使用XML,JSON还是等效的ruby对象进行序列化。
获取存储的数据时,如何将其转换为工作模型对象?这样,当我执行user_fetched_from_redis.username时,它将像user_fetched_from_db.username一样工作。如果有任何字段没有从redis存储中获取,那么我希望activerecord执行SELECT * FROM语句来填充对象中的所有属性。这可能吗?
答案 0 :(得分:1)
看看resque如何处理这个问题。基本上,他们使用JSON对象而不是XML或转储的Ruby对象,我建议使用相同的方法,因为它意味着更少的开销。 Rails为许多不同的对象提供了非常简单的.to_json
功能,包括ActiveRecord实例。
如果使用JSON序列化对象,则在对其进行反序列化时,它将扩展为普通哈希。要传递它来创建一个可以继承属性并使用method_missing
从json对象获取属性或加载相关数据库记录的自定义类并不难。这样的事情应该有效:
class CachedObject
attr_accessor :attributes
def initialize(json)
self.attributes = ActiveSupport::JSON.decode(json)
end
def method_missing(method)
attributes[method.to_s] || Model.find_by_id(attributes['id']).send(method)
end
end
obj = CachedObject.new('{"id":"123","foo":"some value"}')
p obj.foo # => "some value"
p obj.bar # => Executes `Model.find_by_id(123).bar`
答案 1 :(得分:1)
这个问题的解决方案可以在另一篇文章中找到。