sql >> Database >  >> NoSQL >> Redis

Aanhoudend Python-object in het geheugen voor nginx/uwsgi-server

Wat je suggereert is niet direct haalbaar. Aangezien nieuwe processen buiten uw controle op en neer kunnen worden gedraaid, is er geen manier om native Python-gegevens in het geheugen te bewaren.

Er zijn echter een paar manieren om dit te omzeilen.

Vaak is één niveau van sleutelwaardeopslag alles wat u nodig heeft. En soms, met buffers met een vaste grootte voor waarden (die je direct kunt gebruiken als str /bytes /bytearray voorwerpen; al het andere dat u nodig heeft om struct daarin of anderszins serialiseren) is alles wat je nodig hebt. In dat geval zorgt het ingebouwde caching-framework van uWSGI voor alles wat je nodig hebt.

Als je meer nauwkeurige controle nodig hebt, kun je kijken hoe de cache is geïmplementeerd bovenop SharedArea en iets aanpassen. Ik zou dat echter niet aanraden. Het geeft je in feite hetzelfde soort API als een bestand, en de enige echte voordelen ten opzichte van het gebruik van een bestand zijn dat de server de levensduur van het bestand beheert; het werkt in alle door uWSGI ondersteunde talen, zelfs die waarin geen bestanden zijn toegestaan; en het maakt het gemakkelijker om uw aangepaste cache te migreren naar een gedistribueerde (meerdere-computer) cache als dat later nodig is. Ik denk niet dat een van deze relevant voor je is.

Een andere manier om platte sleutelwaarde-opslag te krijgen, maar zonder de buffers met een vaste grootte, is met Python's stdlib anydbm . De key-value lookup is zo pythonisch als maar kan:het ziet eruit als een dict , behalve dat er een back-up van wordt gemaakt naar een BDB-database (of vergelijkbare) op schijf, in de cache waar nodig in het geheugen, in plaats van te worden opgeslagen in een hashtabel in het geheugen.

Als je een paar andere eenvoudige soorten moet afhandelen - alles dat razendsnel te ontdoen/beitsen is, zoals int s—je zou kunnen overwegen shelve .

Als uw structuur rigide genoeg is, kunt u de sleutel-waardedatabase gebruiken voor het hoogste niveau, maar toegang krijgen tot de waarden via een ctypes.Structure , of de/serialiseren met struct . Maar meestal, als je dat kunt doen, kun je ook het hoogste niveau elimineren, waarna je hele ding slechts één grote Structure is. of Array .

Op dat moment kunt u gewoon een gewoon bestand gebruiken voor opslag—ofwel mmap het (voor ctypes ), of gewoon open en read het (voor struct ).

Of gebruik multiprocessing 's Gedeelde ctypes Objecten voor toegang tot uw Structure rechtstreeks uit een gedeeld geheugengebied.

Ondertussen, als je niet altijd alle cachegegevens nodig hebt, maar af en toe stukjes en beetjes, dan is dat precies waar databases voor zijn. Nogmaals, anydbm , etc. is misschien alles wat je nodig hebt, maar als je een complexe structuur hebt, maak dan een ER-diagram, verander het in een reeks tabellen en gebruik zoiets als MySQL.



  1. Redis Enterprise Clustering-opdrachtfout 'CLUSTER'

  2. Redis lua-script werkt niet

  3. Gebruik van ServiceStack.Redis.Sentinel

  4. Rails, Sidekiq - Redis NOAUTH