Redis
 sql >> Base de données >  >> NoSQL >> Redis

Objet Python persistant en mémoire pour le serveur nginx/uwsgi

Ce que vous suggérez n'est pas directement réalisable. Étant donné que de nouveaux processus peuvent être activés et désactivés en dehors de votre contrôle, il n'y a aucun moyen de conserver les données Python natives en mémoire.

Cependant, il existe plusieurs façons de contourner cela.

Souvent, un seul niveau de stockage clé-valeur est tout ce dont vous avez besoin. Et parfois, avoir des tampons de taille fixe pour les valeurs (que vous pouvez utiliser directement comme str /bytes /bytearray objets; tout ce dont vous avez besoin pour struct là-dedans ou autrement sérialiser) est tout ce dont vous avez besoin. Dans ce cas, le cadre de mise en cache intégré d'uWSGI prendra soin de tout ce dont vous avez besoin.

Si vous avez besoin d'un contrôle plus précis, vous pouvez regarder comment le cache est implémenté au-dessus de SharedArea et faites quelque chose de personnalisé. Cependant, je ne le recommanderais pas. Cela vous donne essentiellement le même type d'API que vous obtenez avec un fichier, et les seuls avantages réels par rapport à la simple utilisation d'un fichier sont que le serveur gérera la durée de vie du fichier ; il fonctionne dans toutes les langues prises en charge par uWSGI, même celles qui n'autorisent pas les fichiers ; et cela facilite la migration de votre cache personnalisé vers un cache distribué (multi-ordinateurs) si vous en avez besoin ultérieurement. Je ne pense pas qu'aucun de ceux-ci vous concerne.

Une autre façon d'obtenir un stockage de clé-valeur plat, mais sans les tampons de taille fixe, consiste à utiliser la stdlib anydbm de Python. . La recherche de valeur clé est aussi pythonique que possible :elle ressemble à un dict , sauf qu'il est sauvegardé sur une base de données BDB (ou similaire) sur disque, mis en cache le cas échéant en mémoire, au lieu d'être stocké dans une table de hachage en mémoire.

Si vous avez besoin de gérer quelques autres types simples, tout ce qui est incroyablement rapide à désélectionner, comme int s—vous voudrez peut-être envisager de shelve .

Si votre structure est suffisamment rigide, vous pouvez utiliser la base de données clé-valeur pour le niveau supérieur, mais accéder aux valeurs via un ctypes.Structure , ou dé/sérialiser avec struct . Mais généralement, si vous pouvez faire cela, vous pouvez également éliminer le niveau supérieur, auquel cas tout votre truc n'est qu'une grande Structure ou Array .

À ce stade, vous pouvez simplement utiliser un fichier simple pour le stockage, soit mmap it (pour ctypes ), ou simplement open et read it (pour struct ).

Ou utilisez le multiprocessing ctypes partagés par Objets pour accéder à votre Structure directement depuis une zone de mémoire partagée.

En attendant, si vous n'avez pas besoin de toutes les données du cache tout le temps, juste des morceaux de temps en temps, c'est exactement à cela que servent les bases de données. Encore une fois, anydbm , etc. peut être tout ce dont vous avez besoin, mais si vous avez une structure complexe, établissez un diagramme ER, transformez-le en un ensemble de tables et utilisez quelque chose comme MySQL.