2013-04-30 7 views
2

J'ai expérimenté la mise en cache de fragments de poupées russes sur une application Rails, plus précisément sur sa page principale Dashboard. C'est la première page que l'utilisateur voit après qu'il se connecte et est un excellent candidat pour Russian Doll, car il contient de nombreux éléments imbriqués. La mise en cache fonctionne bien dans les situations où l'utilisateur effectue lui-même des modifications nécessitant que l'application restaure le tableau de bord. Le temps de chargement avec la mise en cache est environ 4x plus rapide que le rendu de la page entière.Comment garder les caches au chaud en utilisant la mise en cache de Russian Doll?

Il existe cependant des situations dans lesquelles les données sont modifiées par le système. Par exemple, chaque nuit, nous mettons à jour toutes les valeurs par le nouveau taux de change du jour précédent. Cela expirera automatiquement la plupart des fragments dans le tableau de bord et le lendemain, l'utilisateur utilisera un cache froid lors de la connexion.

Il est possible de régénérer ces caches fragmentés après les mises à jour du système afin de les garder au chaud. Je suppose que je pourrais manuellement les fragments après toute mise à jour du système, mais je devrais gérer les clés et les dépendances manuellement. (J'utilise actuellement la gemme cache_digest, ce qui est très pratique.).

Des idées?

Répondre

1

S'il s'agit d'une option pour vous, vous pouvez inclure toutes les données dont vous avez besoin pour les calculs dans les attributs de données, puis les convertir en texte en utilisant Javascript.

Ainsi, votre sortie brute pourrait être:

<li data-gbp-amount="2.50"></li>

Ensuite, vous venez avec JS et faire quelque chose comme:

$(document).find("[data-gbp-amount]").each(index, el) -> 
    $(el).text($(el).data("gbp-amount") * todaysExchangeRate) 

Que tout moyen émis par Rails sera mis en mémoire cache, et a gagné ne change pas avec le taux de change.

+0

Cela fonctionne certainement pour les éléments plus petits. Je crois que DHH fait quelque chose de similaire dans son message original. Cependant, dans notre cas, les changements peuvent impliquer des calculs plus compliqués (pas seulement des taux de change) et des fragments entiers peuvent être inclus ou supprimés. Je suppose que cela pourrait encore être fait, mais je devrais passer trop de logique dans JS. – Luciano

0

Tout dépend de cache_key. cache_key est basé sur l'identifiant du modèle, l'attribut updated_at et sur le md5 du template html. Donc, si vous changez une de ces 3 clés, alors vous avez expiré le cache. Je ne sais pas comment vos données sont complexes, mais vous pouvez simplement utiliser la méthode tactile dans votre modèle principal AR :: afin de changer la clé de cache. Peut-être que vous avez un modèle AR :: principal où les autres enregistrements sont des dépendants.

+0

Merci Rinaldi. Toucher l'objet expirera effectivement le cache, de sorte que l'utilisateur atteindra un cache froid lors de son prochain accès. J'essayais en fait de le faire, mais aussi de laisser le nouveau cache prêt pour que l'utilisateur le frappe à la place. – Luciano

Questions connexes