sql >> Database teknologi >  >> NoSQL >> Redis

Vedvarende Python-objekt i hukommelsen til nginx/uwsgi-server

Det du foreslår er ikke direkte gennemførligt. Da nye processer kan drejes op og ned uden for din kontrol, er der ingen måde at beholde indbyggede Python-data i hukommelsen.

Der er dog et par måder at undgå dette på.

Ofte er ét niveau af nøgleværdi-lagring alt, hvad du behøver. Og nogle gange har buffere med fast størrelse til værdier (som du kan bruge direkte som str /bytes /bytearray genstande; alt andet du skal bruge for at struct derinde eller på anden måde serialisere) er alt hvad du behøver. I så fald vil uWSGIs indbyggede caching-ramme tage sig af alt, hvad du har brug for.

Hvis du har brug for mere præcis kontrol, kan du se, hvordan cachen er implementeret oven på SharedArea og gøre noget tilpasse. Det vil jeg dog ikke anbefale. Det giver dig grundlæggende den samme slags API, som du får med en fil, og de eneste reelle fordele i forhold til blot at bruge en fil er, at serveren vil styre filens levetid; det virker på alle uWSGI-understøttede sprog, selv dem der ikke tillader filer; og det gør det nemmere at migrere din brugerdefinerede cache til en distribueret (multi-computer) cache, hvis du senere har brug for det. Jeg tror ikke, at nogen af ​​dem er relevante for dig.

En anden måde at få flad nøgleværdi-lagring, men uden buffere med fast størrelse, er med Pythons stdlib anydbm . Nøgleværdiopslaget er så pytonisk, som det bliver:det ligner et dict , bortset fra at den er sikkerhedskopieret til en BDB-database (eller lignende) på disken, cachelagret som passende i hukommelsen, i stedet for at blive gemt i en hash-tabel i hukommelsen.

Hvis du har brug for at håndtere et par andre simple typer – alt, der er lynhurtigt at fjerne/sylte, såsom int s—du vil måske overveje shelve .

Hvis din struktur er stiv nok, kan du bruge nøgleværdidatabase til det øverste niveau, men få adgang til værdierne gennem en ctypes.Structure , eller af/serialiser med struct . Men normalt, hvis du kan gøre det, kan du også eliminere det øverste niveau, hvorefter hele din sag kun er én stor Structure eller Array .

På det tidspunkt kan du bare bruge en almindelig fil til opbevaring – enten mmap it (for ctypes ), eller bare open og read det (for struct ).

Eller brug multiprocessing 's delte ctypes Objekter for at få adgang til din Structure direkte ud af et delt hukommelsesområde.

I mellemtiden, hvis du faktisk ikke har brug for alle cache-data hele tiden, bare stykker en gang imellem, er det præcis, hvad databaser er til. Igen, anydbm , osv. kan være alt hvad du behøver, men hvis du har en kompleks struktur, skal du tegne et ER-diagram, omdanne det til et sæt tabeller og bruge noget som MySQL.



  1. MongoDB - Svarende til LEFT JOIN, hvor en samling ikke findes

  2. Brug af AngularJs og MongoDB/Mongoose

  3. Sådan implementeres MongoDB for høj tilgængelighed

  4. Mongodb Aggregation Framework:Bruger $group indeks?