Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Objek Python dalam memori yang persisten untuk server nginx/uwsgi

Apa yang Anda sarankan tidak layak secara langsung. Karena proses baru dapat diputar ke atas dan ke bawah di luar kendali Anda, tidak ada cara untuk menyimpan data asli Python dalam memori.

Namun, ada beberapa cara untuk mengatasinya.

Seringkali, hanya satu tingkat penyimpanan nilai kunci yang Anda butuhkan. Dan terkadang, memiliki buffer ukuran tetap untuk nilai (yang dapat Anda gunakan secara langsung sebagai str /bytes /bytearray objek; hal lain yang Anda butuhkan untuk struct di sana atau membuat cerita bersambung) adalah semua yang Anda butuhkan. Dalam hal ini, kerangka kerja caching bawaan uWSGI akan menangani semua yang Anda butuhkan.

Jika Anda membutuhkan kontrol yang lebih tepat, Anda dapat melihat bagaimana cache diimplementasikan di atas SharedArea dan melakukan sesuatu menyesuaikan. Namun, saya tidak akan merekomendasikan itu. Ini pada dasarnya memberi Anda jenis API yang sama dengan yang Anda dapatkan dengan file, dan satu-satunya keuntungan nyata dibandingkan hanya menggunakan file adalah bahwa server akan mengelola masa pakai file; ini berfungsi di semua bahasa yang didukung uWSGI, bahkan bahasa yang tidak mengizinkan file; dan memudahkan untuk memigrasikan cache khusus Anda ke cache yang terdistribusi (multi-komputer) jika Anda membutuhkannya nanti. Saya rasa tidak ada yang relevan bagi Anda.

Cara lain untuk mendapatkan penyimpanan nilai kunci datar, tetapi tanpa buffer ukuran tetap, adalah dengan stdlib anydbm Python . Pencarian nilai kunci sama pythonicnya:terlihat seperti dict , kecuali bahwa itu dicadangkan ke basis data BDB (atau serupa) pada disk, di-cache sebagaimana mestinya di memori, alih-alih disimpan dalam tabel hash dalam memori.

Jika Anda perlu menangani beberapa jenis sederhana lainnya—apa pun yang sangat cepat untuk dibongkar/dihaluskan, seperti int s—Anda mungkin ingin mempertimbangkan shelve .

Jika struktur Anda cukup kaku, Anda dapat menggunakan database nilai kunci untuk tingkat teratas, tetapi mengakses nilai melalui ctypes.Structure , atau de/serialize dengan struct . Tapi biasanya, jika Anda bisa melakukannya, Anda juga bisa menghilangkan level teratas, di mana semua hal Anda hanyalah satu Structure besar atau Array .

Pada saat itu, Anda cukup menggunakan file biasa untuk penyimpanan—baik mmap itu (untuk ctypes ), atau cukup open dan read itu (untuk struct ).

Atau gunakan multiprocessing ctypes yang dibagikan Objek untuk mengakses Structure langsung dari area memori bersama.

Sementara itu, jika Anda tidak benar-benar membutuhkan semua data cache setiap saat, hanya sepotong-sepotong sesekali, itulah gunanya database. Sekali lagi, anydbm , dll. mungkin semua yang Anda butuhkan, tetapi jika Anda memiliki struktur yang kompleks, buat diagram ER, ubah menjadi sekumpulan tabel, dan gunakan sesuatu seperti MySQL.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara meningkatkan penggunaan CPU server Redis?

  2. Docker-compose - Redis di 0.0.0.0 bukannya 127.0.0.1

  3. Bagaimana cara memulai Redis di Heroku?

  4. Benchmark Couchbase mengungkapkan INSERT dan GET yang sangat lambat (menggunakan operasi KeyValue); lebih lambat dari data MySQL yang bertahan

  5. Apakah mungkin untuk memperbarui beberapa kunci hset (bukan bidang) menggunakan mset?