Redis
 sql >> Base de données >  >> NoSQL >> Redis

Script Redis Lua implémentant CAS (check-and-set) ?

Tout ira bien en termes d'atomicité selon la documentation de Redis :

Redis utilise le même interpréteur Lua pour exécuter toutes les commandes. Redis garantit également qu'un script est exécuté de manière atomique :aucun autre script ou commande Redis ne sera exécuté pendant l'exécution d'un script. Cette sémantique est similaire à celle de MULTI / EXEC. Du point de vue de tous les autres clients, les effets d'un script ne sont pas encore visibles ou sont déjà terminés.

Cependant, si le script est trop lent, cela pose problème. Le script est donc le meilleur pour les opérations légères qui nécessitent une certaine logique et atomicité.

Une autre faille dans laquelle vous pourriez tomber est que si le script échouait d'une manière ou d'une autre au milieu, les appels que vous avez effectués ne pourraient pas être annulés, bien que le script renverra une erreur.

Par exemple :Vous avez un script comme celui-ci :

redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)

L'exécution du script renverra une erreur, mais foo a déjà été défini dans redis comme 1 .

Quelque chose sans rapport avec votre question :j'ai remarqué que vous avez utilisé

eval "your_raw_code" key_count keys argv

en fait, vous pouvez appeler le fichier de script lua dans eval lorsque vous êtes dans le terminal :

> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv