L'applicazione su cui sto lavorando ha bisogno di creare un contatore che rappresenti il numero di volte in cui ogni pezzo di contenuto è stato visualizzato.
Ci sono due obiettivi qui:
- Aggiorna il contatore in tempo reale
- Riduci il carico su MySQL
Attualmente ciò che facciamo è creare una chiave di cache in Redis per ogni parte di contenuto che contiene il numero di visualizzazioni. Quando si verifica un evento di visualizzazione, incrementiamo il conteggio delle visualizzazioni. Se non c'è ancora un valore sulla chiave quando avviene una lettura o una scrittura, calcoliamo il conteggio delle visualizzazioni di tutti i tempi utilizzando un'origine dati separata (Influxdb).
Il problema è che il nostro approccio esistente non sarà più fattibile a causa del modo in cui stiamo ristrutturando i dati di InfluxDB. Non è più adeguatamente performante calcolare il conteggio di tutte le visualizzazioni temporali per una carta usando i dati di Influx, per ragioni per cui non entrerò qui (non esitate a chiedere).
Essenzialmente, non abbiamo più un modo per calcolare le visualizzazioni di tutte le ore "da zero". Dovremo fare affidamento sui valori dei contatori esistenti e solo incrementarli (mai completamente ricalcolarli).
Ho la seguente idea per fare questo:
- Calcola le visualizzazioni di tutti i tempi su ogni contenuto e archivia in MySQL (questo può essere fatto una sola volta per seminare i dati)
- Quando una lettura / scrittura avviene per la prima volta, cercalo in MySQL e memorizzalo in Redis
- Ogni volta che si verifica una scrittura, incrementa il conteggio su Redis
- In un lavoro in background, una volta all'ora o giù di lì, aggiorna il numero di visualizzazioni nel database MySQL usando i dati in Redis.
Questo produrrà al massimo un'ora di perdita di dati, se Redis rilascia tutte le chiavi un minuto 59 proprio prima che avvenga il lavoro in background.
Questo approccio ha senso? Se c'è un modo migliore per farlo?
modifica
Ora che ci penso un po 'di più, il concetto di un lavoro in background che aggiorna tutte le carte è un po' problematico. Se nella cache sono presenti milioni di chiavi, in che modo l'applicazione dovrebbe sapere quale attività ha avuto e come dovrebbero essere copiati i conteggi Redis su MySQL?
Quindi, penso che ci possa essere un tasto speciale su Redis che memorizza una coda di tutti gli ID delle carte che hanno avuto aggiornamenti. Quindi il lavoro in background può vedere gli ID di scheda unqiue in questo elenco e richiedere solo i dati per l'aggiornamento.