sql >> Databasteknik >  >> NoSQL >> Redis

Beständigt Python-objekt i minnet för nginx/uwsgi-server

Det du föreslår är inte direkt genomförbart. Eftersom nya processer kan snurras upp och ner utanför din kontroll, finns det inget sätt att behålla inbyggd Python-data i minnet.

Det finns dock några sätt att komma runt detta.

Ofta är en nivå av nyckel-värdelagring allt du behöver. Och ibland, ha buffertar med fast storlek för värden (som du kan använda direkt som str /bytes /bytearray föremål; allt annat du behöver för att struct där eller på annat sätt serialisera) är allt du behöver. I så fall kommer uWSGI:s inbyggda cachingramverk att ta hand om allt du behöver.

Om du behöver mer exakt kontroll kan du titta på hur cachen är implementerad ovanpå SharedArea och göra något anpassa. Jag skulle dock inte rekommendera det. Det ger dig i princip samma typ av API som du får med en fil, och de enda verkliga fördelarna jämfört med att bara använda en fil är att servern kommer att hantera filens livstid; det fungerar på alla uWSGI-stödda språk, även de som inte tillåter filer; och det gör det lättare att migrera din anpassade cache till en distribuerad (fler-dator) cache om du senare behöver. Jag tror inte att någon av dessa är relevant för dig.

Ett annat sätt att få platt nyckel-värdelagring, men utan buffertar med fast storlek, är med Pythons stdlib anydbm . Sökningen av nyckel-värde är så pytonisk som den blir:den ser precis ut som ett dict , förutom att den är säkerhetskopierad till en BDB-databas (eller liknande) på disken, cachad i minnet på lämpligt sätt, istället för att lagras i en hashtabell i minnet.

Om du behöver hantera några andra enkla typer – allt som går blixtsnabbt att ta bort/behandla, som int s—du kanske vill överväga shelve .

Om din struktur är tillräckligt stel kan du använda nyckel-värdedatabas för den översta nivån, men få tillgång till värdena genom en ctypes.Structure , eller av/serialisera med struct . Men vanligtvis, om du kan göra det, kan du också eliminera den översta nivån, då hela din grej bara är en stor Structure eller Array .

Då kan du bara använda en vanlig fil för lagring – antingen mmap it (för ctypes ), eller bara open och read it (för struct ).

Eller använd multiprocessing s delade ctypes Objekt för att komma åt din Structure direkt från ett delat minnesområde.

Under tiden, om du faktiskt inte behöver all cache-data hela tiden, bara bitar och bitar då och då, är det precis vad databaser är till för. Återigen, anydbm , etc. kan vara allt du behöver, men om du har en komplex struktur, rita ett ER-diagram, förvandla det till en uppsättning tabeller och använd något som MySQL.



  1. Uppdatera fält med ett annat fälts värde i dokumentet

  2. Hur konfigurerar man MongoDB Java-drivrutin MongoOptions för produktionsanvändning?

  3. Hur man optimerar prestanda för MongoDB

  4. Användningsfall för updateOne över findOneAndUpdate i MongoDB