Le code suivant sur les transactions (https://redis.io/topics/transactions#cas) ne fonctionne pas "directement" : WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC Il suppose (de manière non implicite) que nous programmions via un langage supplémentaire permettant l’affectation. Le client (par exemple un programme Python) veut : - récupérer la valeur de mykey depuis le serveur Redis - incrémenter de 1 cette valeur - puis stocker cette valeur modifiée sur le serveur (i.e. modifier mykey) On programmerait comme suit (dans un meta-Python): val = redis.get(mykey) val = val + 1 redis.set(val) Mais nous avons potentiellement des problèmes d’accès non exclusif, sur la variable mykey. Le code ci-dessus permet de régler le problème, de manière abstraite, avec la commande WATCH que l'on peut voir comme une pose de verrou. Le verrou est relaché à la terminaison de l'instruction EXEC. Il y a une discussion similaire, sur la question de l'accès exclusif, sur la page https://redislabs.com/ebook/part-2-core-concepts/chapter-3-commands-in-redis/3-7-other-commands/3-7-2-basic-redis-transactions/ Si vous voulez programmer l’exemple (WATCH ... EXEC) de la page https://redis.io/topics/transactions#cas, et l’exécuter pour de vrai, il faut donc passer par... Python par exemple. Pour cela, veuillez suivre le tutoriel : https://fabioconcina.github.io/blog/transactions-in-redis-with-python/ Très simple. Et au final, cela donne le code Python suivant qui s’est exécuté sur une certaine machine alors que mon serveur Redis (qui, entre temps, est tombé, d’ou les erreurs... mais c’est pas grave) peut, physiquement, tourner sur une autre machine, située quelque part sur Internet : $ python3 Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import redis >>> r = redis.Redis() >>> r.set('mykey', 0) Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/redis/connection.py", line 552, in connect sock = self._connect() File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/redis/connection.py", line 609, in _connect raise err File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/redis/connection.py", line 597, in _connect sock.connect(socket_address) ConnectionRefusedError: [Errno 61] Connection refused .... .... >>> r.set('mykey', 0) True >>> r.get('mykey') b'0' >>> p = r.pipeline() >>> p.watch('mykey')# watch for changes on these keys True >>> val = p.get('mykey') >>> val = val + 1 Traceback (most recent call last): File "", line 1, in TypeError: can't concat int to bytes >>> type(val) >>> val = int(p.get('mykey')) >>> val = val + 1 >>> p.multi() >>> p.set('mykey', val) Pipeline>> >>> p.execute() [True] >>> r.get('mykey') b'1' >>>