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

Script Redis Lua che implementa CAS (check-and-set)?

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