Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Trwały obiekt Pythona w pamięci dla serwera nginx/uwsgi

To, co sugerujesz, nie jest bezpośrednio wykonalne. Ponieważ nowe procesy mogą być uruchamiane w górę i w dół poza twoją kontrolą, nie ma możliwości przechowywania natywnych danych Pythona w pamięci.

Istnieje jednak kilka sposobów na obejście tego.

Często wystarczy jeden poziom pamięci klucz-wartość. A czasami posiadanie buforów o stałym rozmiarze dla wartości (których można użyć bezpośrednio jako str /bytes /bytearray przedmioty; wszystko, czego potrzebujesz do struct tam lub w inny sposób serializować) to wszystko, czego potrzebujesz. W takim przypadku wbudowana struktura buforowania uWSGI zadba o wszystko, czego potrzebujesz.

Jeśli potrzebujesz bardziej precyzyjnej kontroli, możesz zobaczyć, jak pamięć podręczna jest zaimplementowana na wierzchu SharedArea i zrób coś dostosuj. Jednak nie polecałbym tego. Zasadniczo zapewnia ten sam rodzaj interfejsu API, jaki otrzymujesz z plikiem, a jedyną realną przewagą nad samym używaniem pliku jest to, że serwer będzie zarządzać czasem życia pliku; działa we wszystkich obsługiwanych przez uWSGI językach, nawet tych, które nie zezwalają na pliki; i ułatwia migrację niestandardowej pamięci podręcznej do rozproszonej (wielokomputerowej) pamięci podręcznej, jeśli zajdzie taka potrzeba. Nie sądzę, aby którekolwiek z nich było dla Ciebie istotne.

Innym sposobem na uzyskanie płaskiej pamięci klucz-wartość, ale bez buforów o stałym rozmiarze, jest użycie biblioteki standardowej Pythona anydbm . Wyszukiwanie klucz-wartość jest tak pythoniczne, jak to tylko możliwe:wygląda jak dict , z tą różnicą, że kopia zapasowa jest tworzona w bazie danych BDB na dysku (lub podobnej), buforowana odpowiednio w pamięci, zamiast być przechowywana w tablicy mieszającej w pamięci.

Jeśli potrzebujesz obsłużyć kilka innych prostych typów — wszystko, co jest niesamowicie szybkie do usunięcia/marynowania, takie jak int s — warto rozważyć shelve .

Jeśli Twoja struktura jest wystarczająco sztywna, możesz użyć bazy danych klucz-wartość dla najwyższego poziomu, ale uzyskaj dostęp do wartości za pomocą ctypes.Structure lub de/serializuj za pomocą struct . Ale zazwyczaj, jeśli możesz to zrobić, możesz również wyeliminować najwyższy poziom, w którym to momencie cała twoja sprawa jest tylko jedną wielką Structure lub Array .

W tym momencie możesz po prostu użyć zwykłego pliku do przechowywania — albo mmap to (dla ctypes ) lub po prostu open i read to (dla struct ).

Lub użyj multiprocessing Udostępnione ctypes Obiekty z dostępem do Twojej Structure bezpośrednio z obszaru pamięci współdzielonej.

Tymczasem, jeśli faktycznie nie potrzebujesz wszystkich danych z pamięci podręcznej przez cały czas, tylko bitów i kawałków od czasu do czasu, właśnie do tego służą bazy danych. Ponownie, anydbm , itp. może być wszystkim, czego potrzebujesz, ale jeśli masz złożoną strukturę, narysuj diagram ER, przekształć go w zestaw tabel i użyj czegoś takiego jak MySQL.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy mogę ustawić globalne TTL w redis?

  2. Pracujesz z obiektami zagnieżdżonymi w Redis?

  3. Asynchroniczne wykonywanie poleceń redis

  4. Jak bezpiecznie połączyć się z Heroku Redis za pomocą wiersza poleceń?

  5. Klucz ioredis z pasującym wzorem