Faktisk datalager og cache bør synkroniseres ved hjælp af den tredje tilgang, som du allerede har beskrevet i dit spørgsmål.
Når du tilføjer data til dit endelige lager (dvs. din SQL-database), skal du sætte disse data i kø til en servicebus eller beskedkø og lade en asynkron service udføre hele synkroniseringen ved hjælp af en form for baggrundsproces.
Du ønsker ikke at komme ind i disse tilfælde (når du ikke bruger en servicebus og asynkron service):
- Gør dine anmodninger eller processer langsommere, fordi brugeren skal vente, indtil dataene både er gemt i din database og cache.
- Har risiko for en fejl under cacheprocessen og ikke at kunne have en genforsøgspolitik (som normalt er en indbygget funktion i en servicebus eller nogle meddelelseskøer). Denne fejl kan også ende i en delvis eller fuldstændig cache-korruption, og du vil ikke automatisk og nemt være i stand til at planlægge en opgave for at løse denne situation.
Det er en god idé at bruge Redis nøgleudløb. Da Redis kan udløbe nøgler ved hjælp af dens indbyggede mekanisme, bør du ikke implementere nøgleudløb fra hele baggrundsprocessen. Hvis en nøgle findes, er det fordi den stadig er gyldig.
BTW, du vil ikke altid være på denne sag (hvis en nøgle ikke er udløbet, betyder det, at den ikke skal overskrives). Det kan afhænge af dit faktiske domæne.