11
votes

Stockage d'objets dans une session dans les rails

On m'a toujours appris que stocker des objets dans une session était une mauvaise idée. Les identifiants doivent plutôt être stockés qui récupèrent l'enregistrement en cas de besoin.

Cependant, j'ai une application que je me demande est une exception à cette règle. Je construis une application FlashCard et les mots qui sont interrogés sont dans une table dans la base de données dont le schéma ne change pas. Je souhaite stocker les mots en cours d'intervalle d'une session, un utilisateur peut donc terminer où ils ont commencé au cas où ils se déplacent sur une page séparée.

Dans ce cas, est-il possible de vous éloigner de stocker ces mots comme des objets de la base de données? Si oui, pourquoi? La raison pour laquelle je demande est que le quiz est conçu pour se déplacer rapidement et que je détesterais gaspiller une base de données sur la récupération d'un enregistrement qui ne change jamais en premier lieu. Cependant, il y a peut-être d'autres négatifs à une grande session que je ne suis pas au courant.

* Pour l'enregistrement, j'ai essayé de la mettre en cache avec les méthodes memcache intégrées dans les rails 2.3, mais apparemment qui a une taille maximale par élément de 1 Mo.


4 commentaires

Une taille de cache maximale de 1 Mo? Cela ne sonne pas bien.


J'ai été surpris comme d'abord mais avoir des problèmes très étranges jusqu'à ce que je découvrais cela: Code. google.com/p/memcached/wiki/... ? Bien que j'aurais aimé juste une bonne façon de le mettre en cache, car cela résoudrait mon problème.


Oh, c'est un maximum de 1 Mo par cache ! J'ai édité votre question pour que cette pièce soit claire.


Ah oui, désolé pour ça, merci pour la modification :)


4 Réponses :


6
votes

rails a tendance à encourager la conception reposante et à utiliser des sessions n'est pas très reposante. Je ferais probablement une ressource de quiz qui a un tas de mots, ainsi qu'un mot actuel. De cette façon, quand ils reviennent, vous saurez où ils étaient.

Maintenant, le repos n'est pas tout (selon qui vous parlez), mais il y a un assez bon cas contre de grandes sessions. N'oubliez pas que les sessions écrivent des choses à destination et à partir du disque, et plus les données que vous écrivez, plus il faut à lire ...


0 commentaires

3
votes

Étant donné que votre application est une application Rails, je suggérerais non plus:

  1. en utilisant la capacité de vos clients à cache En mettant en cache les cartes en JavaScript. (vous auriez besoin d'une application assez Ajaxy pour Faites ceci, voir la dernière RailsCast pour des points intéressants sur la mise en cache de la page JavaScript)
  2. Utilisez l'un des nombreux autres autres Servers supportés par les rails Options de mise en cache (c'est-à-dire memcached) à cache ces données.

0 commentaires

27
votes

La principale raison de ne pas stocker les objets de la session est que si la structure de l'objet change, vous obtiendrez une exception. Considérez les points suivants: xxx

puis, dans une version ultérieure du projet, vous modifiez le nom de la barre. Vous redémarrez le serveur et essayez de saisir FOO de la session. Quand il essaie de désérialiser, il ne trouve pas de barre et explose.

Cela pourrait sembler facile d'éviter ce piège, mais dans la pratique, je l'ai vu mordre un certain nombre de personnes. C'est simplement parce que la sérialisation d'un objet peut parfois prendre plus de choses que cela est immédiatement apparente (ce genre de chose est censé être transparent) et à moins que vous ayez des règles rigoureuses à ce sujet, les choses auront tendance à être battues.

La raison pour laquelle il est normalement fronçait, c'est qu'il est extrêmement courant de mordre les gens à Activerecord, car il est assez courant que la structure de votre application se déplace au fil du temps et que les sessions peuvent être désérialisées une semaine ou plus Après avoir été créé à l'origine.

Si vous comprenez tout cela et êtes prêt à mettre dans l'énergie pour être sûr que votre modèle ne change pas et ne sérialise rien de plus, vous êtes probablement bien. Mais soyez prudent :)


1 commentaires

Vous modifiez le nom de la barre , pouvez-vous être plus précis sur ce changement, comme, un exemple? Nous avons observé un comportement amusant lors de la conservation d'un objet non si grand (un tas d'identifiants) dans les rails 4 app et que vous n'êtes pas sûr de ce qui s'est passé. Merci.



3
votes

Un problème beaucoup plus insidieux que vous rencontrez de stocker des objets directement dans la session est lorsque vous utilisez CookIstore (la valeur par défaut dans les rails 2+, je crois). Il est très facile d'obtenir des erreurs de cookieverflow très difficiles à récupérer.


0 commentaires