sql >> Databáze >  >> RDS >> Mysql

Jak ukládat do mezipaměti objekty vytvořené z databáze MySQL

Existuje mnoho věcí, které je třeba zvážit, ale obecně bych ve vašem případě založil relační mapování na Row Data Gateway vzor (RDG). Pokud nemáte příliš mnoho různých typů objektů, měl by tento přístup k architektuře dostatečně škálovat. RDG by vám mělo usnadnit implementaci ukládání do mezipaměti, pokud omezíte vedení účetnictví mezipaměti na třídu Finder.

Pokud máte čas a vůli, podívejte se na Patterns of Enterprise Application Architecture od Martina Fowlera . Je to studnice dobrých informací.

Nyní ke specifikům...

  • identifikujte data pomocí nějakého druhu ID

Obvykle byste k tomu použili nějaký automaticky inkrementovaný celočíselný sloupec v databázi. K rychlému stažení těchto objektů z mezipaměti můžete použít unordered_map. Protože máte všechny objekty ve své mezipaměti, z důvodu optimalizace můžete také implementovat některé z find* funkce, které nejprve prohledají mezipaměť. Můžete použít unordered_map/unordered_multimap k „indexování“ některých dat, pokud je váš čas hledání velmi omezený, nebo se prostě držte staré dobré mapy/multimapy. To však zdvojnásobuje práci a v databázi takovýchto dotazů to již máte zdarma.

  • upravit data/objekty v mezipaměti

Špinavá data by neměla být viditelná pro zbytek systému, dokud je skutečně nezapíšete do databáze. Jakmile aktualizaci spustíte, a pokud vše půjde podle plánu, můžete buď nahradit objekt v mezipaměti objektem, který jste použili pro aktualizaci, nebo jednoduše smazat objekt v mezipaměti a nechat ostatní čtenáře, aby si jej vybrali z databáze (což bude mít za následek při opětovném ukládání objektu do mezipaměti). Můžete to implementovat klonováním původního objektu Gateway, ale podstatou je, že byste měli mít implementovanou nějakou strategii zamykání.

  • odstranit stará data/objekty a přidat nová data/objekty

Zde jednoduše smažete objekt z mezipaměti a pokusíte se smazat z databáze. Pokud se smazání v databázi nezdaří, ostatní čtečky ji uloží do mezipaměti. Jen se ujistěte, že žádný klient nemá přístup ke stejnému záznamu, když jste v procesu mazání. Při přidávání nových záznamů jednoduše vytvoříte instanci objektu Gateway, předáte jej objektu na úrovni domény, a když budete se změnami hotovi, zavoláte insert na objekt Gateway. Můžete buď vložit nový objekt Gateway do mezipaměti, nebo jednoduše nechat prvního čtenáře, aby jej vložil do mezipaměti.

  • uspořádejte data podle určitého druhu priority (naposledy použitá)
  • Jaký by byl nejlepší způsob ukládání dat/objektů do mezipaměti na základě poskytnutých informací A PROČ?

Jde o výběr nejlepšího algoritmu ukládání do mezipaměti. Na tuto otázku není snadné odpovědět, ale LRU by měla fungovat dobře. Bez skutečných metrik neexistuje správná odpověď, ale LRU se snadno implementuje a pokud nevyhovuje vašim požadavkům, stačí provést metriky a rozhodnout se pro nový algoritmus. Ujistěte se, že to můžete udělat bez problémů tím, že budete mít dobré rozhraní pro mezipaměť. Další věc, kterou je třeba mít na paměti, je, že objekty na úrovni domény by nikdy neměly záviset na limitech vaší mezipaměti. Pokud potřebujete 100 000 objektů, ale máte pouze 50 000 mezipaměti, stále máte v paměti všech 100 000 objektů, ale 50 000 z nich je v mezipaměti. Jinými slovy, vaše objekty by neměly záviset na stavu vaší mezipaměti a také by vám nemělo být jedno, jestli mezipaměť vůbec máte.

Dále, pokud se stále skrýváte s myšlenkou RDG, jednoduše ukládáte do mezipaměti objekt Gateway ve své mezipaměti. Instance objektů Gateway můžete uchovávat ve své mezipaměti pomocí shared_ptr, ale měli byste také zvážit strategii zamykání (optimistický vs pesimistický), pokud se chcete vyhnout nečistým zápisům. Všechny vaše brány (jednu pro každý stůl) mohou také zdědit stejné rozhraní, takže můžete zobecnit své strategie ukládání/načítání a také byste mohli používat jeden fond a přitom zachovat jednoduchost. (Podívejte se na boost::pool. Možná vám to může pomoci s implementací mezipaměti.)

Jeden poslední bod:

Dort je lež! :D Bez ohledu na to, co se rozhodnete udělat, ujistěte se, že je to založeno na slušném množství výkonnostních metrik. Pokud zlepšíte výkon o 20 % a strávili jste tím 2 měsíce, možná by stálo za to zamyslet se nad tím, že byste do svého hardwaru přidali ještě několik gigabajtů RAM. Udělejte nějaký snadno ověřitelný důkaz konceptu, který vám poskytne dostatek informací, zda se vám implementace vaší mezipaměti vyplatí, a pokud ne, vyzkoušejte některá otestovaná a spolehlivá řešení z regálu (memcached nebo podobně, jak již poznamenal @Layne).


  1. Jak nastavíte výchozí pager pro klienta MySQL?

  2. Jak připojím databázový soubor mysql k místní aplikaci ruby ​​on rails

  3. Jak seskupit podle měsíce a vrátit nulu, pokud pro určitý měsíc neexistuje žádná hodnota?

  4. MYSQL:Metoda SELECT – ale nezobrazují se duplikáty / GROUP nebo DISTINCT?