memcachad | |
---|---|
Sorts | cache |
Utvecklaren | Danga Interactive [d] |
Skrivet i | C [1] |
Operativ system | plattformsoberoende |
Första upplagan | 22 maj 2003 |
senaste versionen |
|
Licens | modifierad BSD-licens [d] [3] |
Hemsida | memcached.org |
Memcached är en programvara som implementerar en datacachetjänst i minnet baserad på en hashtabell .
Med hjälp av ett klientbibliotek (för C / C++ , Ruby , Perl , PHP , Python , Java , .Net , etc.) kan du cachelagra data i RAM-minnet på många tillgängliga servrar . Distribution implementeras genom att segmentera data efter nyckelns hashvärde, liknande hashtabellsockets. Klientbiblioteket beräknar hashen med hjälp av datanyckeln och använder den för att välja lämplig server. En serverfelssituation tolkas som en cachemiss, vilket gör det möjligt att öka komplexets feltolerans genom att öka antalet memcachade servrar och möjligheten att hot-swap dem.
Det memcachade API:et har bara grundläggande funktioner: att välja en server, ställa in och bryta en anslutning, lägga till, ta bort, uppdatera och hämta ett objekt, samt Jämför-och-byta . För varje objekt ställs en livstid in, från 1 sekund till oändligt. När minnet är slut raderas äldre objekt automatiskt. För PHP finns det också färdiga PECL - bibliotek för att arbeta med memcached, vilket ger ytterligare funktionalitet.
Memcached använder port 11211 som standard.
Observera att alla funktioner som beskrivs i detta avsnitt är skrivna i pseudokod . Syntaxen för att anropa Memcached kan skilja sig beroende på vilket programmeringsspråk och API som används.
En databasfråga (utan att använda memcached) kan se ut som följande exempel:
function get_foo ( int användar-id ) { result = db_select ( "SELECT * FROM users WHERE userid = ?" , användar- id ); returnera resultat ; }Efter att ha introducerat användningen av memcached kan samma anrop se ut så här (hädanefter används pseudokod , syntaxen för att anropa memcached kan skilja sig åt):
function get_foo ( int användar-id ) { /* kontrollera cachen först */ data = memcached_fetch ( "användarrad:" + användar-id ); if ( ! data ) { /* hittades inte: frågedatabas */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , användar- id ); /* lagra i cache för framtida förfrågningar */ memcached_add ( "användare:" + användar-id , data ); } returnera data ; }Servern kommer först att kontrollera om Memcached lagrar ett värde med en unik nyckel "userrow: userid", där användar-id är ett nummer. Om cachen inte innehåller sådana data kommer servern att fråga databasen som vanligt och ställa in en unik nyckel med ett anrop till det memcachade API:et.
Men om endast detta API-anrop används kan servern returnera felaktiga data efter en databasuppdatering: Memcached kommer att lagra och returnera inaktuella data. Därför behövs en uppdatering förutom anropet till cachedata också:
function update_foo ( int användar-id , sträng dbUpdateString ) { /* uppdatera databasen först */ result = db_execute ( dbUpdateString ); if ( resultat ) { /* databasuppdatering slutförd: förbered data för cache-post */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , användar- id ); /* den sista raden kan också se ut som data = createDataFromDBString(dbUpdateString); */ /* cache uppdaterad data */ memcached_set ( "användarrad:" + användar-id , data ); } }Detta anrop kommer endast att uppdatera cachad data för att matcha den nya data i databasen om begäran om databasuppdatering lyckas. Ett annat tillvägagångssätt kan vara att tömma cachen för den givna nyckeln med hjälp av Memcached-funktionen så att ett efterföljande anrop inte hittar data i cachen och frågar databasen efter det. Liknande åtgärder behövs vid radering av data från databasen så att cachen förblir korrekt eller delvis tom.