sql >> Databasteknik >  >> NoSQL >> Redis

hur man håller cachen uppdaterad

Eftersom du använder en cache måste du tolerera datainkonsekvensproblemet , d.v.s. vid någon tidpunkt skiljer sig data i cache från data i databasen.

Du behöver inte uppdatera värdet i cachen när värdet har ändrats. Annars kommer hela cachesystemet att vara mycket komplicerat (t.ex. måste du upprätthålla en lista över nycklar som har cachelagrats), och det kan också vara onödigt att göra det (t.ex. nyckel-värdet kan bara användas en gång och inget behov för att uppdatera den mer).

Hur kan vi uppdatera data i cachen och hålla cachesystemet enkelt?

Vanligtvis, förutom att ställa in eller uppdatera ett nyckel-värdepar i cachen, ställer vi också in en TIMEOUT för varje nyckel . Efter det kan klienten hämta nyckel-värdeparet från cachen. Men om en nyckel når timeout tar cachesystemet bort nyckel-värdeparet från cachen. Detta kallas THE KEY HAS BEEN EXPIRED . Nästa gång kommer klienten som försöker hämta nyckeln från cachen att inte få någonting. Detta kallas CACHE MISS . I det här fallet måste klienten hämta nyckel-värdeparet från databasen och uppdatera det till cache med en ny timeout.

Om data har uppdaterats i databasen, medan nyckeln INTE har gått ut i cachen, kommer klienten att få inkonsekventa data. Men när nyckeln har gått ut, kommer dess värde att hämtas från databasen och infogas i cachen av någon klient. Efter det kommer andra klienter att få uppdaterad data tills data har ändrats igen.

Hur ställer man in timeout?

Normalt finns det två typer av utgångspolicy:

  1. Upphör att gälla om N sekunder/minuter/timmar...
  2. Upphör vid någon framtida tidpunkt, t.ex. löper ut 2017/7/30 00:00:00

En stor timeout kan till stor del minska belastningen på databasen, medan data kan vara inaktuella under en lång tid. En liten timeout kan hålla informationen uppdaterad så mycket som möjligt, samtidigt som databasen kommer att belastas hårt. Så du måste balansera avvägningen när du utformar timeout .

Hur förfaller Redis-nycklar?

Redis har två sätt att förfalla nycklar:

  1. När klienten försöker använda en nyckel, kontrollerar Redis om nyckeln har nått timeout. Om den gör det tar Redis bort nyckeln och agerar som om nyckeln inte finns. På så sätt säkerställer Redis att klienten inte får förfallna data.
  2. Redis har också en utgångstråd som samplar nycklar med en konfigurerad frekvens. Om nycklarna når timeout tar Redis bort dessa nycklar. På så sätt kan Redis påskynda processen för nyckelförfall.


  1. Hur ställer jag in en primärnyckel i MongoDB?

  2. MongoDB-uppdatering med skick

  3. Node.js - Session kvarstår inte genom res.redirect()

  4. Har Meteor en distinkt fråga för samlingar?