Redis
 sql >> Database >  >> NoSQL >> Redis

Incrementare centinaia di contatori contemporaneamente, redis o mongodb?

A seconda di come è strutturata la struttura della chiave, consiglierei di eseguire la pipeline dei comandi zincr. Hai un semplice trigger di "commit":la richiesta. Se dovessi scorrere i tuoi parametri e zincr ogni chiave, alla fine della richiesta passare il comando di esecuzione sarà molto veloce. Ho implementato un sistema come quello che descrivi sia come app cgi che come app Django. Ho creato una struttura chiave sulla falsariga di questa:

AAAA-MM-GG:HH:MM -> insieme ordinato

Ed è stato in grado di elaborare qualcosa come 150000-200000 incrementi al secondo sul lato redis con un singolo processo che dovrebbe essere sufficiente per lo scenario descritto. Questa struttura chiave mi consente di acquisire dati in base a finestre temporali. Ho anche aggiunto una scadenza alle chiavi per evitare di scrivere un processo di pulizia del db. Ho quindi avuto un cronjob che avrebbe impostato le operazioni per "arrotolare" le statistiche su orari, giornalieri e settimanali utilizzando varianti del modello di chiave sopra menzionato. Ho portato queste idee in quanto sono modi in cui puoi sfruttare le capacità integrate di Redis per semplificare il lato dei rapporti. Ci sono altri modi per farlo, ma questo schema sembra funzionare bene.

Come notato da eyossi, il blocco globale può essere un vero problema con i sistemi che eseguono scritture e letture simultanee. Se stai scrivendo questo come un sistema in tempo reale, la concorrenza potrebbe essere un problema. Se si tratta di un sistema di analisi del log "end if day", probabilmente non attiverebbe la contesa a meno che non si eseguano più istanze del parser o dei report al momento dell'input. Per quanto riguarda il mantenimento delle letture veloci in Redis, prenderei in considerazione la creazione di un'istanza redis di sola lettura svincolata da quella principale. Se lo metti sul server che esegue il rapporto e indichi il processo di rapporto su di esso, dovrebbe essere molto veloce generare i rapporti.

A seconda della memoria disponibile, delle dimensioni del set di dati e dell'eventuale archiviazione di altri tipi di dati nell'istanza redis, potresti prendere in considerazione l'esecuzione di un server redis a 32 bit per ridurre l'utilizzo della memoria. Un'istanza 32b dovrebbe essere in grado di conservare molti di questo tipo di dati in un piccolo pezzo di memoria, ma se l'esecuzione del normale Redis a 64 bit non richiede troppa memoria, sentiti libero di usarlo. Come sempre testa i tuoi modelli di utilizzo per convalidare