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

redis:azzera il contatore ogni giorno

Considera due transazioni simultanee che si verificano a mezzanotte. Entrambi possono eseguire get(dt_key), ma uno eseguirà prima il blocco MULTI/EXEC. Azzererà il contatore, imposterà la nuova data, incrementerà il contatore. Il secondo entrerà anche nel suo blocco MULTI/EXEC, ma poiché il valore di 'dt' è cambiato, l'esecuzione fallirà e incr_daily_number verrà richiamato nuovamente. Questa volta get(dt_key) restituirà la nuova data, quindi quando verrà eseguito il blocco MULTI/EXEC, il contatore verrà incrementato senza alcun reset. Le due transazioni restituiranno la nuova data con valori di contatore diversi.

Quindi, credo che qui non ci siano condizioni di razza e che le coppie (data, numero) saranno uniche.

Avresti anche potuto implementarlo utilizzando uno script Lua lato server (la cui esecuzione è sempre atomica). Di solito è più conveniente.

Nota che in realtà non esiste un blocco Redis. Il meccanismo di blocco disponibile nell'API è fornito dal client Python, non dal server Redis. Se osservi la sua implementazione, ti renderai conto che si basa anche su blocchi SETNX + WATCH/MULTI/EXEC o script Lua.