Posledních několik dní jsem byl zavalen přítelkyní, školou a prací, že jsem se k blogování téměř nedostal. Trpí tím hlavně slíbené seriály, z nich Django bych chtěl dopsat ve středu večer. O víkendu jsem byl ve škole, což byla tentokrát, krom nebezpečného večera, ohromná kupa nudy a začal jsem si číst o NoSQL, které jsem se o pár hodin později pokusil použít v administraci pro Roští.cz a docela se mi zalíbilo.

Především jsem řešil následující problém. Administrace při vytváření nového uživatele čte nějaké údaje ze systému (třeba jestli má daný uživatel vytvoření účet). K těm se dostává přes SSH a autentizaci řeším klíči. Takovýhle proces jsem zvolil kvůli tomu, že mohu mít v jedné administraci uživatele rozložené přes několik serverů. Admin jim pak dává vědět kde mají databázi, kde vyzvedávat e-maily atd. Problém nastává v době, kdy potřebuju při každém kliku na přidání PostgreSQL databáze zjistit, jestli má už daný člověk vytvořený účet. To se udělá jednoduše. Připojím se přes SSH na server kde by měl účet mít a pomocí psql se dopátrám odpovědi. Jenže tahle sranda stojí dost času, který já sice mám, ale uživatel už ne a to nejlepší co by mohl udělat, je kliknout několikrát.

No rozhodl jsem se tyto prodlevy odstranit NoSQL stylem a postavit nad dotazování cache. Na základě těchto hodnot pak budu moct hromadně vypisovat stav konfigurace jednotlivých uživatelů. U všech takto udržovaných hodnot (zatím existence účtu pro MySQL a PostgreSQL) řeším i opětovné vytvoření záznamu v cache, pokud ten zmizí, ale správně by tam měl být. Když se ještě dokopu k tomu, abych doplnil k mé implementaci keystore databáze expiraci, tak budu moct udržovat téměř reálná data, i když se v systému něco změní. Takové případy nejsou nikdy dobré a spíš povedou k debugovacím hlášením v mé e-mailové schránce, takže bych to nazval nejistým jistícím mechanizmem, protože při změně v systému se klíč z databáze prostě neodstraní.

Doba takové expirace pak závisí na tom, jak „jistou“ konzistenci dat bych si přál a jak pohodlné by to měl uživatel. Když dám expiraci na hodinu, využije se cache na aktuální změny na účtu, což u administrace hostingu bohatě stačí. Ale už taková cache nejde využít pro prohlížení statistik jednotlivých uživatelů. Expirace v takovém případě nepřinese nic dobrého, takže se ještě rozmýšlím.

Implementaci jsem udělal nad Djangem a jeho databázovým modelem. K tomu jsem si udělal čtyři jednoduché funkce kset(), kget(), krm() a klist(). V aplikaci pak jednoduše vytvářím, čtu a ruším klíče. U časově náročných operací, kde výsledkem je nějaká informace, to bude neocenitelný pomocník.

Django má vcelku dobrou podporu třeba pro NoSQL databázi redis a to díky projektu django-kvstore. Nicméně se mi zdá použití zbytečně složité a navíc by se ukládala další data někde jinde, jako kdyby nestačilo, že musím vytvářet cache pro získání konfigurace systému. Vytvořením dalšího úložiště bych si mohl zadělat na problémy.

Tohle je vlastně poprvé, kdy jsem se setkal s implementací cache v nějakém projektu. I když některé mé weby dělají desítku SQL dotazů na jeden klik, nikdy se to nedostalo do takových mezí, že by to bylo vidět třeba na loadu serveru. Cache ale v tomto případě odstraní několika sekundové čekání, které by měl uživatel s každým klikem podstoupit. Náhodou jsem si NoSQL spojil s mým projektem v době, kdy jsem implementoval nové funkce, které toho dokáží využít. Navíc se dá moje keystore databáze využít i pro konfiguraci některých parametrů.