Cache condivisa - Best practice per l'invalidazione


14

Mi piacerebbe sapere quale sarebbe un approccio migliore per invalidare / aggiornare gli oggetti cache.

Prerequisiti

  • Avere un server memcached remoto (che funge da cache per più applicazioni)
  • Tutti i server sono ospitati da azzurro (aree di affinità, stessi data center)
  • La dimensione dell'oggetto della cache varia da 200 byte a 50 kilobyte


Approccio 1 (memorizzare nella cache al più presto)

  1. Viene creato l'oggetto A -> memorizza nel database e memorizza nella cache
  2. Oggetto A richiesto dal client -> verifica l'esistenza della cache, altrimenti recupera dal database e archivia nella cache
  3. L'oggetto A viene aggiornato -> archivia nel database, archivia nella cache

L'approccio 1 sembra essere più semplice. Se qualcosa viene creato, inserisci la cache il prima possibile. Indipendentemente da qualcuno ne avrà bisogno.


Approccio 2 (archivio cache pigro)

  1. Viene creato l'oggetto A -> memorizza nel database
  2. Oggetto A richiesto dal client -> verifica l'esistenza della cache, altrimenti recupera dal database e archivia nella cache
  3. L'oggetto A viene aggiornato -> archivia nel database, cancella la chiave nella cache

L'approccio 2 sembra essere più consapevole della memoria. In questo approccio solo gli elementi richiesti vanno nella cache.


Domanda 1: in considerazione delle prestazioni, quale sarebbe un approccio migliore? La memoria e la CPU non contano ancora.

Domanda 2: I miei pensieri sono una sorta di ottimizzazione prematura?

Domanda 3: Qualche altro pensiero? Altri approcci?

Risposte:


12
  1. È senza risposta, tranne per dire che dipende. Ci sono molti fattori che determineranno quale approccio sarà il migliore nel tuo caso, ad esempio: è normale che gli oggetti creati vengano recuperati poco dopo la loro creazione? Qual è il rapporto tra gli aggiornamenti e gli accessi?
  2. Ri. decidendo che hai bisogno di una cache: se stai ottimizzando senza dati, sì, si tratta di ottimizzazione tecnicamente prematura. Dico tecnicamente poiché l'esperienza / la saggezza convenzionale potrebbero dirti che avrai bisogno di una cache di qualche tipo. Ri. decidere come funziona meglio la cache: sì, è sicuramente un'ottimizzazione prematura.
    • L'ottimizzazione spesso non consiste nel trovare la soluzione migliore / più ottimale. Dovrebbe andare come segue:
      1. Trova i colli di bottiglia nel sistema.
      2. Scopri dove puoi fare la differenza più grande con la minima quantità di lavoro.
      3. Fai il minimo lavoro!
      4. È abbastanza veloce ancora? In caso contrario, vai al numero 1.
      5. Fatto!
    • Onestamente, nessuno degli approcci che descrivi sembra complicato. Perché non implementare entrambi e vedere quale funziona meglio?
    • Il passaggio 3 dell'approccio n. 2 può essere modificato in "L'oggetto A viene aggiornato -> archivia nel database, aggiorna la voce nella cache".

Baqueta, grazie per la tua risposta. Lo apprezzo molto
lurkerbelow,

@lurkerbelow Sono contento di aiutarti.
vaughandroid,

2

memcached gestisce gli oggetti con la propria politica, quale oggetto memorizzato nella cache scadrebbe se nessuno accedesse a esso o se la memoria della memoria memcached fosse esaurita. Pertanto, il tuo primo approccio non è una buona idea poiché l'oggetto in memcached continuerebbe a essere invalidato a causa di memoria insufficiente durante la creazione di oggetti.

Q1. L'approccio 2 sarebbe migliore in termini di prestazioni perché non invia oggetto a memcached, sebbene il miglioramento delle prestazioni sia molto piccolo.

Q2. È difficile da dire. Supponi di conoscere il collo di bottiglia e di definire gli approcci che non sarebbero prematuri.

Q3. Esistono altri approcci come la cache solo in memcached.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.