2011-02-25 5 views
9

J'utilise redis comme mon cache Web, et je veux stocker ces objets activerecord à redis directement, mais en utilisant redis-rb j'obtiens une erreur.comment enregistrer l'objet activeecord de rails à redis

Il semble que je ne peux pas le sérialiser ou quoi que ce soit. Est-ce qu'il y a une lib pour faire ça pour moi? Dois-je le sérialiser au format json?

Quel format de sérialisation serait le plus efficace?

Répondre

14

Redis stocke des chaînes (et quelques autres structures de données de chaînes); Vous pouvez donc sérialiser en valeurs Redis comme vous le souhaitez tant que vous vous retrouvez avec une chaîne. JSON est probablement le meilleur endroit pour commencer car il est maigre, pas trop fragile, fonctionne bien avec les modèles de mise à niveau en direct, et est lisible in situ. Plus tard, vous pouvez ajouter plus de complexité pour atteindre vos objectifs si nécessaire, par exemple, la compression. #to_json et #from_json sont déjà sur ActiveRecord si vous voulez utiliser JSON (avec YAJL ou son semblable qui ne devrait pas être excessivement lent, relativement parlant.) #to_xml est aussi là, si vous êtes dans S & M.

marshaling Raw peut aussi fonctionner, mais de temps en temps va mal épouvantablement (j'ai eu marshalés objets dépassent 2MB après LZO compression qui étaient seulement quelques K JSON.)

Si c'est vraiment un goulot d'étranglement pour vous, vous aurez Vous voulez exécuter vos propres tests d'efficacité pour vos objectifs, par exemple, vitesse d'écriture, vitesse de lecture ou taille de stockage, avec vos propres objets et modèles de données.

+0

merci Yuri, vous m'avez vraiment dit ce que je veux savoir. Il semble que json est ma meilleure option ici ... Merci encore! –

+0

Juste essayant ceci maintenant, semble marshal est le bon choix si vous incluez des associations. Il va restaurer les choses dans le bon type. Avec JSON, les associations sont simplement stockées sous forme de hash, vous obtenez donc une erreur en essayant de restaurer avec from_json. – mahemoff

+0

http://msgpack.org/ est un excellent choix aussi. Plus petit et plus efficace que JSON. –

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

semble JSON est plus commode pour moi, mais je vais faire un test de performances par rapport à la méthode maréchal. Merci quand même. –

0

Vous pouvez convertir votre modèle à un hachage en utilisant la méthode des attributs puis enregistrez avec 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 
Questions connexes