2010-03-06 6 views
7

Il existe actuellement deux problèmes de stockage des objets ActiveRecord dans memcached.Quelle est la meilleure façon de stocker un objet ActiveRecord dans memcached?

  1. Le problème Undefined classe/module (Google search). D'après ce que j'ai lu, c'est toujours un bug pour lequel personne n'a vraiment de bonne solution. Le plugin cache_fu a probablement la meilleure solution pour cela, en enveloppant son appel retrieve dans un bloc qui essaie d'attraper cette erreur, analyse le message et essaie de charger la classe/module indéfini.

  2. Le billet infâme LH # 1339 (LH Ticket). Ce bug ne se produira que si vous avez mis les cache_classes à FALSE (développement, test).

Après googler pendant des semaines, j'ai toujours pas trouvé une bonne technique pour stocker les instances AR dans memcached sans avoir à traiter avec les 2 questions énumérées ci-dessus. L'idée que je n'ai pas encore essayée est de supprimer les attributs de l'instance en tant que chaînes (juste comment AR les reçoit de la DB avant de faire le cast de son type), en les stockant dans memcached et ensuite en les récupérant du cache, instancier un objet AR en utilisant ces valeurs. Est-ce possible? Si oui, quelle est la meilleure façon de le faire?

Je cherche simplement comment d'autres développeurs de Rails ont résolu ce problème.

Répondre

3

Dans nos projets, nous stockons l'objet au format XML.

cache.write(user.cache_key, user.to_xml) # write to cache 
User.new(Hash.from_xml(cache.read(cache_key))) # reach from cache xml 

Il existe un coût supplémentaire pour la sérialisation/désérialisation du code XML. Mais cela nous a permis de partager le cache parmi les applications non Ruby.

+0

J'aime l'idée, j'essaierai –

+0

J'irais probablement avec JSON à ce stade. En tout cas, j'ai trouvé stocker n'importe quoi mais les ficelles, les ints, et les tableaux de la même chose dans memcached est la folie. –

+0

Cela ne fonctionne pas très bien lorsque vous dépendez des objets AR extraits du cache pour répondre à #new_record? et #id comme ils le feraient s'ils étaient chargés depuis la base de données. Cette méthode crée juste un nouvel objet AR non enregistré qui partage certaines propriétés avec l'objet réel. –

Questions connexes