Come tenere traccia efficacemente delle chiavi della cache per invalidarle di conseguenza?

2

In un'applicazione ordinaria, le stesse informazioni possono essere recuperate dal database in diversi modi. Se tutti questi modi implementano la memorizzazione nella cache, è necessario invalidare tutte le voci della cache durante l'aggiornamento di una voce nel database.

Alcuni accoppiamenti tra aggiornamenti e selezioni sono facili da fare. Facciamo un esempio di un prodotto 123 nella categoria 9 con un prezzo di $ 12,50. Se selezioni un prodotto per ID:

select [...] from [Shop].[Product] where [ProductId] = 123

memorizzandolo nella cache con una chiave Product<Id:123> , non è così difficile invalidare questa voce della cache dopo aver aggiornato il prezzo di un prodotto identificato dal suo ID:

update [Shop].[Product] set [Price] = 14.99 where [ProductId] = 123

Le cose diventano più difficili quando devi anche ricordare di invalidare la cache con la chiave MostExpensive<CategoryId:9> corrispondente alla query:

select max([Price]) from [Shop].[Product] where [CategoryId] = 9

Che cos'è un modo efficace per tenere traccia delle voci della cache? Come trovare, durante lo sviluppo o la revisione del codice, quali voci devono essere invalidate quando uno o l'altro pezzo di dati viene modificato?

    
posta Arseni Mourzenko 25.07.2012 - 15:54
fonte

1 risposta

1

MySQL invalida le sue cache di query basate sulla tabella sottostante. Se la tabella utilizzata nella query viene modificata con INSERT, UPDATE o DELETE, qualsiasi query memorizzata nella cache con riferimenti a tale tabella viene invalidata. (So che MySQL non è l'esempio brillante delle migliori pratiche, ma in questo caso funziona molto bene.)

Quindi, nel tuo esempio, se aggiorni mai [Shop]. [Product] puoi invalidare tutte le cache con riferimenti ad esso. Avresti bisogno di un secondo set di meta-dati che collega ogni tabella alle relative chiavi di immissione della cache, ad es. [Shop].[Product] => (Product<Id:123>, MostExpensive<CategoryId:9>) .

Un percorso leggermente più efficiente sarebbe NON invalidare quelle chiavi che fanno riferimento alla chiave primaria della tabella quando tali record non sono aggiornati. Pertanto, se aggiorni il record con ProductId 345, non invalida la chiave Product<Id:123> .

Se si passano tutte le query attraverso un livello di cache che cattura rapidamente i nomi delle tabelle da ogni query e gestisce tutte le voci della cache è gestibile. Sento che probabilmente c'è una soluzione completamente diversa che è più diretta, ma non posso pensarne una al momento.

    
risposta data 25.07.2012 - 16:28
fonte

Leggi altre domande sui tag