Použitie Redis cache výrazne zlepšuje výkon a efektivitu aplikácií, najmä pri dotazovaní na dáta. Ale zároveň to prináša aj určité problémy. Medzi nimi je najdôležitejším problémom konzistentnosť dát, ktorá je striktne neriešiteľná. Ak je potrebná konzistentnosť dát, potom cache nie je možné použiť.
Ďalšie typické problémy sú prenikanie cache, lavína cache a rozpad cache. V súčasnosti existujú v odvetví aj populárnejšie riešenia. Tento článok nemá za cieľ tieto tri problémy riešiť dokonalejšie, ani podkopávať populárne riešenia v odvetví. Namiesto toho demonštrujeme tieto tri problémové javy priamo v kóde. Dôvodom je, že je ťažké mať v hlave veľmi živý koncept len tým, že sa pozriete na akademické vysvetlenie týchto problémov, a s reálnymi ukážkami kódu môžete prehĺbiť svoje porozumenie a pochopenie týchto problémov.
Prenikanie do cache
Penetrácia cache označuje dotazovanie dát, ktoré v databáze neexistujú. Ak kľúč neexistuje alebo kľúč vypršal, databáza sa dotazuje a dotazované objekty sa ukladajú do vyrovnávacej pamäte. Ak je objekt databázového dotazu prázdny, nie je uložený do vyrovnávacej pamäte.
Tok kódu
- parameter prenáša primárne ID kľúča objektu
- Získajte objekt z cache na základe kľúča
- Ak objekt nie je prázdny, vráti sa priamo
- Ak je objekt prázdny, vykonajte databázový dotaz
- Ak objekt dotazovaný z databázy nie je prázdny, vložte ho do cache (nastavte čas vypršania). Predstavte si túto situáciu, čo by sa stalo, keby bol vložený parameter -1? Tento -1 je objekt, ktorý nesmie existovať. Databáza sa bude dotazovať zakaždým, každý dotaz bude prázdny a nebude zakaždým uložený do vyrovnávacej pamäte. Ak dôjde k škodlivému útoku, táto zraniteľnosť môže byť zneužitá na vyvíjanie tlaku na databázu alebo ju dokonca preťaženie. Aj keď sa použije UUID, je ľahké nájsť neexistujúci KEY a zaútočiť.
Vo svojej práci použijem metódu ukladania nulových hodnôt do vyrovnávacej pamäte, teda krok 5 v [kódovom procese], ak je objekt dotazovaný z databázy prázdny, tiež sa vloží do cache, ale nastavený čas vypršania cache je krátky, napríklad nastavenie na 60 sekúnd.
Lavína cache
Lavína cache označuje vypršanie cache setu počas určitého časového obdobia.
Jedným z dôvodov lavíny, napríklad, pri písaní tohto článku je, že čoskoro bude nula dvanásty deň a čoskoro príde vlna rýchleho nakupovania. Potom o jednej ráno vyprší zásoba tejto dávky tovaru. Prístupový dotaz pre túto dávku tovarov sa nachádza v databáze a pre databázu budú periodické tlakové špičky.
Keď Xiaobian robí e-commerce projekty, zvyčajne prijíma rôzne kategórie tovarov a uchováva rôzne cykly. Tovar v rovnakej kategórii, plus náhodný faktor. Týmto spôsobom sa čas expirácie cache môže čo najviac rozptýliť, čas cache produktov v populárnych kategóriách je dlhší a cache produktov v nepopulárnych kategóriách kratší, čo môže tiež šetriť zdroje cache služby.
V skutočnosti centralizovaná expirácia nie je veľmi smrteľná a ešte nebezpečnejšia lavína cache je, že jeden z uzlov cache servera vypadne alebo sa odpojí. Keďže lavína cache, ktorá prirodzene vzniká, musí byť vytvorená v určitom časovom období, databáza dokáže tlak odolať a v tomto čase ho dokáže odolať aj databáze. Nie je to nič iné ako periodický tlak na databázu. Výpadok uzla cache service spôsobuje nepredvídateľný tlak na databázový server a je pravdepodobné, že databázu okamžite preťaží.
Rozpad cache
Rozpad cache označuje kľúč, ktorý je veľmi horúci, neustále nesie veľkú súbežnosť, veľká súbežnosť sa sústreďuje na prístup k tomuto bodu, keď tento kľúč zlyhá, kontinuálna veľká súbežnosť prerazí cache a priamo žiada databázu, podobne ako vŕtanie diery do bariéry.
Keď Xiaobian robil e-commerce projekty, urobil z tohto produktu "hit".
V skutočnosti je vo väčšine prípadov ťažké vyvinúť drvivý tlak na databázový server. Len málo spoločností dosiahlo túto úroveň. Preto pragmatický editor pripravil hlavné produkty včas, aby cache nikdy nevypršala. Aj keď sa niektoré produkty samy prefermentujú do dávky, môžu byť nastavené tak, že nikdy neexpirujú.
Hlavná cesta je jednoduchá a mutexový kľúč na vzájomné odmietnutie sa naozaj nepoužíva.
|