Starai bene in termini di atomicità secondo la documentazione di Redis:
Redis utilizza lo stesso interprete Lua per eseguire tutti i comandi. Inoltre Redis garantisce che uno script venga eseguito in modo atomico:nessun altro script o comando Redis verrà eseguito durante l'esecuzione di uno script. Questa semantica è simile a quella di MULTI / EXEC. Dal punto di vista di tutti gli altri client gli effetti di uno script o non sono ancora visibili o sono già completati.
Tuttavia, se lo script è troppo lento, causa problemi. Quindi lo script è il migliore per le operazioni leggere che richiedono un po' di logica e atomicità.
Un'altra scappatoia in cui potresti cadere è che, se lo script in qualche modo fallisce nel mezzo, non è possibile ripristinare le chiamate che hai eseguito, sebbene lo script restituirà un errore.
Ad esempio:hai uno script come questo:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
L'esecuzione dello script restituirà un errore, ma foo
è già stato impostato in redis come 1
.
Qualcosa non correlato alla tua domanda:ho notato che hai usato
eval "your_raw_code" key_count keys argv
in realtà potresti chiamare il file di script lua in eval quando sei nel terminale:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv