Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Dit is een door AI vertaalde post.

제이온

[DB] Criteria voor het instellen van de cache

Selecteer taal

  • Nederlands
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • हिन्दी
  • Magyar

Samengevat door durumis AI

  • Een cache is een techniek die vaak gelezen, weinig geschreven gegevens opslaat om de efficiëntie van de service te verhogen. U kunt APM-tools zoals DataDog gebruiken om RDB-query-oproepen te analyseren om cache-doelwitten te identificeren.
  • Lokale caching is een methode waarbij cachegegevens worden opgeslagen in het geheugen van de applicatieserver. Dit is snel, maar er kunnen problemen met cache-synchronisatie tussen instanties optreden. Globale caching gebruikt een aparte server zoals Redis om cachegegevens op te slaan. Dit maakt delen tussen instanties mogelijk, maar de netwerkverkeer kan de snelheid vertragen.
  • TTL (Time To Live) wordt gebruikt om de cache te synchroniseren. Voor read/write die op één server plaatsvinden, is een TTL van meer dan een uur gebruikelijk. Voor read/write die op meerdere servers plaatsvinden, is een TTL van seconden tot minuten gebruikelijk.

Hallo! Ik ben Jayeon.

Vandaag ga ik uitleggen hoe je een cache instelt. Dit is een bericht dat ik heb geschreven op basis van mijn eigen ervaringen in de praktijk, dus het is belangrijk om het als een referentie te beschouwen ㅎㅎ


Wat is een cache?

Een cache is een manier om resultaten van toekomstige aanvragen op te slaan om ze sneller te kunnen serveren. Met andere woorden, we slaan de resultaten van tevoren op en wanneer er later een aanvraag komt, verwerken we die aanvraag zonder de DB of API te raadplegen, maar door de cache te gebruiken. De basis voor het gebruik van een cache is de Pareto-wet.

De Pareto-wet stelt dat 80% van de resultaten wordt veroorzaakt door 20% van de oorzaken. Neem gerust een kijkje naar de onderstaande afbeelding!



Met andere woorden, een cache hoeft niet alle resultaten te cachen. Door alleen de 20% te cachen die het meest wordt gebruikt bij het serveren, kunnen we de algehele efficiëntie verhogen.


Welke gegevens moeten worden gecached?

Volgens de Pareto-wet moeten we niet zomaar alle gegevens cachen, maar alleen de gegevens die echt noodzakelijk zijn. Maar welke gegevens moeten we dan cachen?


Gegevens die vaak worden gelezen, maar zelden worden geschreven

We horen vaak dat we “gegevens die vaak worden gelezen, maar zelden worden geschreven” moeten cachen. In de praktijk is de definitie van “vaak lezen” en “zelden schrijven” echter vrij vaag.


Daarom onderzoek ik de te cachen gegevens in de volgende stappen.


  • Ik gebruik een APM zoals Data Dog om de top 5 RDB query-aanroepen te controleren.
  • Daarvan zoek ik naar query's die worden gebruikt om gegevens op te halen en controleer ik vanuit welke tabel ze worden opgehaald.
  • Ik controleer hoe vaak de update-query's voor die tabel worden uitgevoerd.


Door dit proces te volgen, kijken we of er veel query's zijn om gegevens op te halen, maar weinig update-query's. In mijn praktijkervaring had een tabel 1.740.000 keer een query om gegevens op te halen per dag, maar de update-query's werden maximaal 500 keer uitgevoerd. Dat is een duidelijk teken dat deze gegevens geschikt zijn voor caching ㅎㅎ


Gevoelige gegevens voor bijwerking

Gevoelige gegevens voor bijwerking betekenen dat er een korte periode moet zijn waarin de gegevens in de RDB en de cache niet met elkaar overeenkomen. Bijvoorbeeld, gegevens over betalingen zijn zeer gevoelig voor bijwerking, dus zelfs als ze aan de bovenstaande cache-voorwaarden voldoen, moeten we goed nadenken over de toepassing ervan.


Ik moest gegevens over betalingen cachen die aan beide eigenschappen voldeden. Daarom heb ik de cache niet voor alle logica die deze tabel met gegevens over betalingen gebruikt toegepast, maar heb ik besloten om gedeeltelijk caching toe te passen op relatief veilige logica waar geen betalingen plaatsvinden.


Lokale caching versus globale caching

We hebben nu een idee welke gegevens we moeten cachen en wat de omvang van de caching moet zijn. Nu moeten we bepalen “waar” we de te cachen gegevens moeten opslaan. Over het algemeen kunnen we gegevens opslaan in het lokale geheugen of op een aparte server, zoals Redis.


Lokale caching

Bij lokale caching worden de te cachen gegevens opgeslagen in het geheugen van de applicatieserver. Hiervoor worden meestal Guava cache of Caffeine cache gebruikt.


Voordelen

  • Het is snel omdat we de cache kunnen opzoeken in het geheugen van dezelfde server terwijl we de applicatielogica uitvoeren.
  • Het is eenvoudig te implementeren.


Nadelen

  • Er ontstaan verschillende problemen als er meerdere instanties zijn.
    • Wijzigingen in de cache van één instantie kunnen niet worden doorgegeven aan andere instanties. Er zijn echter ook lokale caching-bibliotheken die wijzigingen naar andere instanties kunnen doorgeven.
    • De cache wordt voor elke instantie opgeslagen, dus als er een nieuwe instantie wordt gestart, moet de cache opnieuw worden ingevuld. Dit kan leiden tot veel cachemissen, waardoor de instantie het verkeer niet aankan en crasht.


Globale caching

Bij globale caching wordt een aparte server gebruikt om de cachegegevens op te slaan, zoals Redis.


Voordelen

  • De cache wordt gedeeld tussen instanties, dus als een instantie de cache wijzigt, kunnen alle instanties dezelfde cachewaarde ophalen.
  • Als er een nieuwe instantie wordt gestart, hoeft deze alleen maar naar de bestaande cacheopslag te kijken, dus we hoeven de cache niet opnieuw in te vullen.


Nadelen

  • Het netwerkverkeer is nodig, dus het is langzamer dan lokale caching.
  • Er is een aparte cacheserver nodig, wat extra infrastructuurkosten met zich meebrengt.
    • Extra infrastructuurkosten? → serverkosten, tijd die nodig is voor het instellen en onderhouden van de infrastructuur, het bedenken van een strategie voor het beheren van storingen, enz.


Welke keuze heb ik gemaakt?

De applicatieservers van het bedrijf waar ik werk, zijn geconfigureerd om meerdere instanties te starten, maar ik heb voor lokale caching gekozen.

Er zijn drie belangrijke redenen.


  • De te cachen gegevens in de RDB zijn ongeveer 40.000, dus zelfs als we ze allemaal in het geheugen laden, is dat minder dan 4 MB.
  • De prestaties van het opzoeken van gegevens over betalingen moesten worden verbeterd.
  • We hebben wel Redis, maar het opslaan van een nieuwe cache in Redis brengt extra infrastructuurkosten met zich mee.


Hoe worden de cachegegevens bijgewerkt?

Als er meerdere applicatieservers zijn en we lokale caching gebruiken, kunnen de cachewaarden voor elke applicatieserver verschillen. Bijvoorbeeld, de cachegegevens die zijn opgeslagen op server A kunnen “1” zijn, terwijl de cachegegevens die zijn opgeslagen op server B “2” kunnen zijn na een wijziging op server B. Als een gebruiker een aanvraag stuurt naar de load balancer, kan deze verschillende waarden van server A en server B ontvangen.


Daarom moeten we de cache op elke instantie automatisch verwijderen en de gegevens van de RDB opvragen. Dit wordt meestal gedaan met behulp van TTL.


Hoe lang moet de TTL zijn?

TTL staat voor Time To Live en is een instelling die de cache na een bepaalde tijd wist. Als we bijvoorbeeld de TTL op 5 seconden instellen, worden de cachegegevens na 5 seconden automatisch gewist. Daarna wordt er een cachemiss uitgevoerd en worden de gegevens van de RDB opgehaald en opgeslagen.

Hoe lang moet de TTL dan zijn?


Lezen/schrijven vindt plaats op één cacheserver

Als het lezen/schrijven plaatsvindt op één globale cacheserver, zoals Redis, of op één applicatieserver met lokale caching, is het geen probleem om de TTL-waarde te verhogen naar meer dan een uur. De cache wordt immers bijgeschreven en de server die gegevens van die cache ophaalt, heeft altijd toegang tot de meest recente gegevens.


In dit geval kunnen we de TTL zelfs overslaan en de cache automatisch wissen met behulp van het LRU-algoritme wanneer de cacheserver vol is.


Lezen/schrijven vindt plaats op meerdere cacheservers

Als lezen/schrijven plaatsvindt op meerdere globale cacheservers of op meerdere applicatieservers met lokale caching, is het beter om de TTL in te stellen op seconden of minuten. Dit komt omdat er een kans is dat je oude gegevens leest van een cacheserver die de bijgewerkte gegevens nog niet heeft ontvangen.


In dit geval wordt de TTL bepaald in verschillende contexten. Hoe belangrijker de bijwerking en hoe groter de kans op wijzigingen, hoe korter de TTL moet zijn. Hoe minder belangrijk de bijwerking en hoe kleiner de kans op wijzigingen, hoe langer de TTL kan zijn.


Hoe heb ik de TTL ingesteld?

De gegevens die ik cache, zijn gerelateerd aan betalingen, en hoewel ik geen caching heb toegepast op de strikte logica waarbij betalingen plaatsvinden, is bijwerking belangrijk vanwege de aard van betalingen. Omdat de kans op bijwerking echter klein is, heb ik de TTL ter veiligheid ingesteld op 5 seconden.


Conclusie

Samenvattend zijn de door mij gekozen caching-methoden als volgt:


  • Gegevens over betalingen
  • Zeer frequent opgevraagd, maar zelden bijgewerkt.
  • Caching is toegepast op de logica waar geen betalingen plaatsvinden, maar wel gegevens worden opgevraagd.
  • Lokale caching is toegepast en de TTL is ingesteld op 5 seconden.


De volgende stap is om prestatie-tests uit te voeren op basis van de werkelijke caching-methoden die ik heb geïmplementeerd. Ik ben nog steeds aan het nadenken over de precieze manier om de prestatie-tests uit te voeren, dus ik zal daarover in een volgend bericht schrijven!

제이온
제이온
제이온
제이온
[Effectieve Java] Item 6. Vermijd onnodige objectcreatie Een gids over het verminderen van onnodige objectcreatie in Java. Voor onveranderlijke objecten zoals String en Boolean is het beter om literals te gebruiken, en voor reguliere expressies is het beter om Pattern-instanties te cachen. Autoboxing kan ook le

28 april 2024

[Spring] @Async gebruiken Ontdek hoe je Java-asynchrone verwerking gemakkelijk kunt implementeren met behulp van Spring @Async. Met de @Async-annotatie kun je synchrone methoden naar asynchroon converteren en de efficiëntie verhogen door thread-poolinstellingen. We behandelen ook

25 april 2024

[Java] Gesynchroniseerde verzameling versus gelijktijdige verzameling Gesynchroniseerde verzamelingen in Java (Vector, Hashtable, Collections.synchronizedXXX) zorgen voor gelijktijdigheid in een multi-threaded omgeving, maar kunnen leiden tot prestatieverlies en problemen wanneer meerdere bewerkingen worden gecombineerd. Al

25 april 2024

[Niet-major, overleven als ontwikkelaar] 14. Samenvatting van veelgestelde technische interviewvragen voor beginnende ontwikkelaars Deze gids is bedoeld om beginnende ontwikkelaars te helpen met de voorbereiding op technische interviews. Het behandelt concepten die vaak ter sprake komen tijdens interviews, zoals het hoofdgeheugengebied, gegevensstructuren, RDBMS en NoSQL, procedurele
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 april 2024

Redis 7.4 - Licentiebeleid gewijzigd Redis is een in-memory database die snelheid en gebruiksvriendelijke dataverwerking combineert. De licentievoorwaarden zijn onlangs gewijzigd, waardoor cloudproviders die Redis-producten hosten nu een licentieovereenkomst moeten afsluiten. Algemene ontwik
해리슨 블로그
해리슨 블로그
해리슨 블로그
해리슨 블로그

21 maart 2024

[Concurrency] Atomaire bewerking: Memory Fence en Memory Ordering Deze blogpost bespreekt hoe geheugensorde te overwegen in atomaire bewerkingen en het belang van de Ordering-opties. We bespreken verschillende Ordering-opties zoals Relaxed, Acquire, Release, AcqRel, SecCst, inclusief een beschrijving van de voor- en nad
곽경직
곽경직
곽경직
곽경직
곽경직

12 april 2024

Fysieke datamodelering Fysieke datamodelering is het proces van het ontwerpen van tabellen in een relationele database voor daadwerkelijk gebruik. Dit omvat het optimaliseren van de prestaties door middel van opslagruimte-efficiëntie, gegevensverdeling en indexontwerp. Trage qu
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 april 2024

3 dingen die ik wil zeggen tegen individuele beleggers die voor het eerst aandelen kopen Dit is advies over waardebeleggingsstrategieën en een positieve mentaliteit voor individuele beleggers die voor het eerst aandelen kopen. Waardebeleggen is een strategie waarbij je op korte termijn kansen op marktmisprijzen koopt en op lange termijn wacht
고집스런가치투자
고집스런가치투자
고집스런가치투자
고집스런가치투자

3 april 2024

Wat is Slot-Filling? Slot-Filling is wanneer een chatbot herhaaldelijk vragen stelt totdat hij alle benodigde informatie van de gebruiker heeft gekregen. Bijvoorbeeld bij het bestellen van koffie, zal de chatbot vragen naar het type, de temperatuur en de hoeveelheid, en de be
꿈많은청년들
꿈많은청년들
Afbeelding met de tekst Slot-Filling
꿈많은청년들
꿈많은청년들

13 mei 2024