Memcached

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 20 decembrie 2021; verificarea necesită 1 editare .

memcached
Tip de cache
Dezvoltator Danga Interactive [d]
Scris in C [1]
Sistem de operare multiplatformă
Prima editie 22 mai 2003
ultima versiune
Licență licență BSD modificată [d] [3]
Site-ul web memcached.org

Memcached  este un software care implementează un serviciu de stocare în cache a datelor în memorie bazat pe un tabel hash .

Cu ajutorul unei biblioteci client (pentru C / C++ , Ruby , Perl , PHP , Python , Java , .Net , etc.) vă permite să stocați în cache datele în memoria RAM a multor servere disponibile . Distribuția este implementată prin segmentarea datelor după valoarea hash a cheii, similar cu socket-urile tabelelor hash. Biblioteca client calculează hash-ul folosind cheia de date și o folosește pentru a selecta serverul corespunzător. O situație de eroare a serverului este interpretată ca o pierdere a memoriei cache, ceea ce face posibilă creșterea toleranței la erori a complexului prin creșterea numărului de servere memcache și a capacității de a le schimba la cald.

API-ul memcached are doar funcții de bază: alegerea unui server, configurarea și întreruperea unei conexiuni, adăugarea, ștergerea, actualizarea și obținerea unui obiect, precum și Compare-and-swap . Pentru fiecare obiect este setată o durată de viață, de la 1 secundă la infinit. Când memoria este epuizată, obiectele mai vechi sunt șterse automat. Pentru PHP , există și biblioteci PECL gata făcute pentru a lucra cu memcached, care oferă funcționalități suplimentare.

Memcached utilizează implicit portul 11211.

Exemplu de cod

Vă rugăm să rețineți că toate funcțiile descrise în această secțiune sunt scrise în pseudocod . Sintaxa pentru apelarea Memcached poate diferi în funcție de limbajul de programare și API-ul utilizat.

O interogare de bază de date (fără a utiliza memcached) ar putea arăta ca următorul exemplu:

funcția get_foo ( int userid ) { rezultat = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ); returnează rezultatul ; }

După introducerea utilizării memcached, același apel poate arăta astfel (în continuare, se folosește pseudocod , sintaxa pentru apelarea memcached poate diferi):

funcția get_foo ( int userid ) { /* verifica mai întâi memoria cache */ date = memcached_fetch ( "userrow:" + userid ); dacă ( ! date ) { /* nu a fost găsit: baza de date de interogări */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ); /* stocați în cache pentru solicitări viitoare */ memcached_add ( "userrow:" + userid , date ); } date returnate ; }

Serverul va verifica mai întâi dacă Memcached stochează o valoare cu o cheie unică „userrow: userid”, unde userid este un număr. Dacă memoria cache nu conține astfel de date, serverul va interoga baza de date ca de obicei și va seta o cheie unică folosind un apel către API-ul memcached.

Cu toate acestea, dacă este utilizat numai acest apel API, serverul poate returna date incorecte după orice actualizare a bazei de date: Memcached va stoca și va returna date învechite. Prin urmare, pe lângă apelul la datele din cache, este necesară și o actualizare:

function update_foo ( int userid , string dbUpdateString ) { /* mai întâi actualizați baza de date */ rezultat = db_execute ( dbUpdateString ); dacă ( rezultat ) { /* Actualizarea bazei de date finalizată: pregătiți datele pentru intrarea în cache */ data = db_select ( "SELECT * FROM users WHERE userid = ?" , userid ); /* ultima linie ar putea arăta și ca data = createDataFromDBString(dbUpdateString); */ /* cache datele actualizate */ memcached_set ( "userrow:" + userid , date ); } }

Acest apel va actualiza datele din cache pentru a se potrivi cu noile date din baza de date numai dacă solicitarea de actualizare a bazei de date reușește. O altă abordare ar putea fi să ștergeți memoria cache pentru cheia dată folosind funcția Memcached, astfel încât un apel ulterior să nu găsească datele în cache și să interogă baza de date pentru ele. Acțiuni similare sunt necesare în cazul ștergerii datelor din baza de date, astfel încât memoria cache să rămână corectă sau parțial goală.

Note

  1. InfoQ: Implementarea JGroups a Memcached suportă failover și JMX
  2. Versiunea 1.6.17 - 2022.
  3. https://github.com/memcached/memcached/blob/1.5.9/LICENSE

Link -uri