sql >> Databáze >  >> NoSQL >> Redis

Trvalý objekt Python v paměti pro server nginx/uwsgi

To, co navrhujete, není přímo proveditelné. Vzhledem k tomu, že nové procesy lze točit nahoru a dolů mimo vaši kontrolu, neexistuje způsob, jak zachovat nativní data Pythonu v paměti.

Existuje však několik způsobů, jak to obejít.

Často stačí jedna úroveň úložiště párů klíč–hodnota. A někdy mít vyrovnávací paměti s pevnou velikostí pro hodnoty (které můžete použít přímo jako str /bytes /bytearray předměty; cokoliv dalšího potřebujete struct tam nebo jinak serializovat) je vše, co potřebujete. V takovém případě se o vše, co potřebujete, postará vestavěný systém mezipaměti uWSGI.

Pokud potřebujete přesnější kontrolu, můžete se podívat, jak je mezipaměť implementována nad SharedArea a udělat něco na míru. To bych však nedoporučoval. V zásadě vám poskytuje stejný druh rozhraní API, jaké získáte se souborem, a jedinou skutečnou výhodou oproti pouhému použití souboru je, že server bude spravovat životnost souboru; funguje ve všech jazycích podporovaných uWSGI, dokonce i v těch, které nepovolují soubory; a usnadňuje to migraci vaší vlastní mezipaměti do distribuované (vícepočítačové) mezipaměti, pokud budete později potřebovat. Nemyslím si, že žádný z nich je pro vás relevantní.

Dalším způsobem, jak získat ploché úložiště klíč–hodnota, ale bez vyrovnávacích pamětí s pevnou velikostí, je stdlib Pythonu anydbm . Vyhledávání párů klíč–hodnota je tak pythonic, jak jen může být:vypadá to jako dict , kromě toho, že se zálohuje do databáze BDB (nebo podobné) na disku, která se podle potřeby ukládá do paměti, místo aby byla uložena v tabulce hash v paměti.

Pokud potřebujete zvládnout několik dalších jednoduchých typů – cokoli, co se neuvěřitelně rychle sundává/vybírá, například int s – možná budete chtít zvážit shelve .

Pokud je vaše struktura dostatečně rigidní, můžete pro nejvyšší úroveň použít databázi párů klíč–hodnota, ale k hodnotám přistupovat prostřednictvím ctypes.Structure , nebo de/serializovat pomocí struct . Ale obvykle, pokud to dokážete, můžete také odstranit nejvyšší úroveň, v tomto okamžiku je vaše celá věc jen jedna velká Structure nebo Array .

V tomto okamžiku můžete pro uložení použít pouze prostý soubor – buď mmap it (pro ctypes ), nebo stačí open a read it (pro struct ).

Nebo použijte multiprocessing Sdílené ctypes Objekty pro přístup k vaší Structure přímo mimo oblast sdílené paměti.

Mezitím, pokud ve skutečnosti nepotřebujete všechna data z mezipaměti neustále, jen útržky a kousky jednou za čas, přesně k tomu jsou databáze. Opět anydbm , atd. může být vše, co potřebujete, ale pokud máte složitou strukturu, nakreslete ER diagram, přeměňte jej na sadu tabulek a použijte něco jako MySQL.



  1. Proč nevyprší platnost klíčů Redis?

  2. Co je operátor $unwind v MongoDB?

  3. Nasazení MongoDB ve virtuálním privátním cloudu Amazon (VPC)

  4. Jaký je správný způsob, jak zvládnout připojení Redis v Tornado? (Asynchronní – Pub/Sub)