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

Oggetto Python in memoria persistente per il server nginx/uwsgi

Quello che stai suggerendo non è direttamente fattibile. Dal momento che i nuovi processi possono essere fatti girare su e giù al di fuori del tuo controllo, non c'è modo di mantenere in memoria i dati nativi di Python.

Tuttavia, ci sono alcuni modi per aggirare questo problema.

Spesso, un livello di archiviazione chiave-valore è tutto ciò di cui hai bisogno. E a volte, avere buffer di dimensioni fisse per i valori (che puoi usare direttamente come str /bytes /bytearray oggetti; qualsiasi altra cosa ti serva per struct in lì o altrimenti serializzare) è tutto ciò di cui hai bisogno. In tal caso, il framework di memorizzazione nella cache integrato di uWSGI si occuperà di tutto ciò di cui hai bisogno.

Se hai bisogno di un controllo più preciso, puoi vedere come viene implementata la cache sopra SharedArea e fai qualcosa di personalizzare. Tuttavia, non lo consiglierei. Fondamentalmente ti dà lo stesso tipo di API che ottieni con un file e gli unici veri vantaggi rispetto al semplice utilizzo di un file sono che il server gestirà la durata del file; funziona in tutte le lingue supportate da uWSGI, anche quelle che non consentono file; e semplifica la migrazione della cache personalizzata a una cache distribuita (multicomputer), se necessario in seguito. Non credo che nessuno di questi sia rilevante per te.

Un altro modo per ottenere una memoria di valori-chiave flat, ma senza i buffer di dimensione fissa, è con stdlib anydbm di Python . La ricerca del valore-chiave è pitonica come sembra:sembra proprio un dict , tranne per il fatto che viene eseguito il backup su un database BDB su disco (o simile), memorizzato nella cache in modo appropriato in memoria, invece di essere archiviato in una tabella hash in memoria.

Se hai bisogno di gestire alcuni altri tipi semplici, qualsiasi cosa sia incredibilmente veloce da decomprimere/rimuovere, come int s—potresti prendere in considerazione shelve .

Se la tua struttura è sufficientemente rigida, puoi utilizzare il database dei valori-chiave per il livello superiore, ma accedere ai valori tramite un ctypes.Structure o de/serializza con struct . Ma di solito, se puoi farlo, puoi anche eliminare il livello più alto, a quel punto la tua intera cosa è solo una grande Structure o Array .

A quel punto, puoi semplicemente usare un semplice file per l'archiviazione, sia mmap it (per ctypes ), o semplicemente open e read it (per struct ).

Oppure usa il multiprocessing ctypes condivisi di Oggetti per accedere alla tua Structure direttamente da un'area di memoria condivisa.

Nel frattempo, se in realtà non hai bisogno di tutti i dati della cache in ogni momento, solo bit e pezzi ogni tanto, è esattamente a questo che servono i database. Di nuovo, anydbm , ecc. potrebbero essere tutto ciò di cui hai bisogno, ma se hai una struttura complessa, disegna un diagramma ER, trasformalo in un insieme di tabelle e usa qualcosa come MySQL.