memcached | |
---|---|
Type | cache |
Udvikler | Danga Interactive [d] |
Skrevet i | C [1] |
Operativ system | på tværs af platforme |
Første udgave | 22. maj 2003 |
nyeste version |
|
Licens | ændret BSD-licens [d] [3] |
Internet side | memcached.org |
Memcached er en software , der implementerer en datacachetjeneste i hukommelsen baseret på en hash - tabel .
Ved hjælp af et klientbibliotek (til C / C++ , Ruby , Perl , PHP , Python , Java , .Net , osv.) giver det dig mulighed for at cache data i RAM på mange tilgængelige servere . Fordeling implementeres ved at segmentere dataene efter nøglens hashværdi, svarende til hash-tabelsockets. Klientbiblioteket beregner hashen ved hjælp af datanøglen og bruger den til at vælge den relevante server. En serverfejlssituation tolkes som en cache-miss, hvilket gør det muligt at øge kompleksets fejltolerance ved at øge antallet af memcachede servere og muligheden for at hot-swap dem.
Den memcached API har kun grundlæggende funktioner: at vælge en server, opsætte og afbryde en forbindelse, tilføje, slette, opdatere og hente et objekt samt Sammenlign-og-bytte . For hvert objekt er der angivet en levetid, fra 1 sekund til uendelig. Når hukommelsen er opbrugt, slettes ældre objekter automatisk. Til PHP er der også færdige PECL - biblioteker til at arbejde med memcached, som giver ekstra funktionalitet.
Memcached bruger port 11211 som standard.
Bemærk venligst, at alle funktioner beskrevet i dette afsnit er skrevet i pseudokode . Syntaksen for at kalde Memcached kan variere afhængigt af det anvendte programmeringssprog og API.
En databaseforespørgsel (uden at bruge memcached) kan se ud som følgende eksempel:
function get_foo ( int bruger- id ) { result = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ); returnere resultat ; }Efter at have introduceret brugen af memcached, kan det samme opkald se sådan ud (herefter bruges pseudokode , syntaksen for at kalde memcached kan variere):
function get_foo ( int bruger- id ) { /* tjek cache først */ data = memcached_fetch ( "brugerrække:" + bruger- id ); if ( ! data ) { /* ikke fundet: forespørgselsdatabase */ data = db_select ( "VÆLG * FRA brugere WHERE bruger-id = ?" , bruger- id ); /* gem i cache til fremtidige anmodninger */ memcached_add ( "brugerrække:" + bruger- id , data ); } returnere data ; }Serveren vil først tjekke om Memcached gemmer en værdi med en unik nøgle "userrow: userid", hvor bruger-id er et tal. Hvis cachen ikke indeholder sådanne data, vil serveren forespørge databasen som sædvanlig og indstille en unik nøgle ved hjælp af et opkald til den memcachede API.
Men hvis kun dette API-kald bruges, kan serveren returnere forkerte data efter enhver databaseopdatering: Memcached vil gemme og returnere forældede data. Ud over opkaldet til cache-data er der derfor også behov for en opdatering:
function update_foo ( int bruger- id , streng dbUpdateString ) { /* opdater databasen først */ resultat = db_execute ( dbUpdateString ); if ( resultat ) { /* databaseopdatering gennemført: klargør data til cache-indtastning */ data = db_select ( "VÆLG * FRA brugere WHERE bruger-id = ?" , bruger- id ); /* den sidste linje kunne også ligne data = createDataFromDBString(dbUpdateString); */ /* cache opdaterede data */ memcached_set ( "brugerrække:" + bruger- id , data ); } }Dette kald vil kun opdatere de cachelagrede data, så de matcher de nye data i databasen, hvis anmodningen om databaseopdatering lykkes. En anden fremgangsmåde kan være at tømme cachen for den givne nøgle ved hjælp af Memcached-funktionen, så et efterfølgende opkald ikke finder dataene i cachen og forespørger databasen efter dem. Lignende handlinger er nødvendige i tilfælde af sletning af data fra databasen, så cachen forbliver korrekt eller delvist tom.