开发者

how to save activerecord object of rails to redis

开发者 https://www.devze.com 2023-02-13 03:07 出处:网络
I am using redis as my web cache, and I want to store those activerecord objects to redis directly, but using redis-rb I get an error.

I am using redis as my web cache, and I want to store those activerecord objects to redis directly, but using redis-rb I get an error.

It seems t开发者_如何学Pythonhat I can't serialize it or some what. Is there a lib to do this for me? Am I have to serialize it to json format?

Which serialization format would be the most efficient?


Redis stores strings (and a few other data structures of strings); so you can serialize into Redis values however you like so long as you end up with a string.

JSON is probably the best place to start as it's lean, not overly brittle, works well with live upgrade patterns, and is readable in situ. Later you can add more complexity to meet your goals as needed, e.g., compression. #to_json and #from_json are already on ActiveRecord if you want to use JSON (with YAJL or its ilk that shouldn't be excessively slow, relatively speaking.) #to_xml is also there, if you're into S&M.

Raw marshaling can also work, but occasionally goes horrifically wrong (I've had marshaled objects exceed 2MB after LZO compression that were only a few K in JSON.)

If it's really a bottleneck for you, you'll want to run your own efficiency tests for your goal(s), e.g., write speed, read speed, or storage size, with your own objects and data patterns.


You can convert your model to a hash using attributes method and then save it with 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


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

精彩评论

暂无评论...
验证码 换一张
取 消