Implementación de transacción y bloqueo optimista en Redis

Comandos relacionados con transacciones de Redis:

Transacción abierta: multi

Cerrar transacción: descartar

Confirmar transacción: exec

 Ejecución normal de transacciones:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> establecer nombre zhangsan EN COLA
127.0.0.1:6379
> establecer edad 20 EN COLA 127.0.0.1:6379> establecer alto 172 EN COLA 127.0.0.1:6379> exec 1) OK
2 ) Aceptar 3) Aceptar 127.0.0.1:6379>






 abandono de negocio

127.0.0.1:6379> multi
OK
127.0.0.1:6379> establecer nombre zhangsan EN COLA
127.0.0.1:6379
> establecer edad 23 EN COLA
127.0.0.1:6379
> establecer alta 172
EN COLA
127.0.0.1:6379> descartar
OK
127.0.0.1: 6379> obtener nombre
(cero)
127.0.0.1:6379>

Excepción de compilación, error de código, error de comando

127.0.0.1:6379> multi
OK
127.0.0.1:6379> establecer nombre zhangsan EN COLA
127.0.0.1:6379
> establecer edad 26 EN COLA
127.0.0.1:6379
> establecer alta 172
EN
COLA 127.0.0.1:6379> getset nombre ###错误命令
(error) ERR número incorrecto de argumentos para el comando 'getset'
127.0.0.1:6379> set wight 45
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transacción descartada debido a errores anteriores.
127.0.0.1:6379> obtener nombre
(cero)
127.0.0.1:6379>
 

 Excepción de tiempo de ejecución, a excepción de los errores de sintaxis que no se ejecutarán y se lanzará una excepción, otros comandos correctos se pueden ejecutar normalmente

127.0.0.1:6379> multi
OK
127.0.0.1:6379> establecer nombre zhangsan EN COLA 127.0.0.1:6379> establecer edad 23 EN COLA 127.0.0.1:6379
> obtener edad EN COLA 127.0.0.1:6379 > incr nombre EN COLA 127.0.0.1: 6379> exec 1) OK 2) OK 3) "23" 4) (error) El valor ERR no es un número entero o está fuera de rango 127.0.0.1:6379> get age "23" 127.0.0.1:6379>














 

 Resumir:

De lo anterior, se puede concluir que Redis admite una sola transacción de comando, pero la transacción no puede garantizar la atomicidad (ejecutar múltiples comandos después de abrir la transacción).

Implementación de Redis Optimistic Lock

reloj de prueba multihilo

Hilo uno (abra una ventana de línea de comando):

127.0.0.1:6379> teclas *
(lista vacía o conjunto)
127.0.0.1:6379> configurar dinero 100
OK
127.0.0.1:6379> configurar costo 0
OK
127.0.0.1:6379> ver dinero
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby money 20
QUEUED
127.0.0.1:6379> decrby cost 10
QUEUED
127.0.0.1:6379> exec ###Ejecutar el comando exec después de ejecutar el subproceso 2
(nil)
127.0.0.1:6379>

Subproceso 2 (abrir otra ventana de línea de comando) Esta transacción se ejecuta antes de que se confirme la transacción del subproceso 1 

 Se encuentra que cuando el subproceso 2 modifica el valor de la clave como dinero, y luego el subproceso 1 ejecuta el comando exec, el monitor encuentra que el valor del dinero ha cambiado, por lo que la ejecución de la transacción falla

Bloqueo optimista y bloqueo pesimista

Bloqueo pesimista: habrá problemas en cualquier momento, por lo que ha sido monitoreado y no se permite que se ejecute ningún subproceso hasta que se complete el paso actual, ¡ lo cual es una pérdida de rendimiento! generalmente no se usa

Bloqueo optimista: juzgue al actualizar los datos y juzgue si los datos monitoreados han cambiado durante este período.Si no hay cambios, se ejecutará normalmente, de lo contrario, la ejecución será incorrecta.

Resumir:

Un solo comando es atómico en redis, pero las transacciones no son atómicas.

Redis puede admitir el bloqueo optimista

Supongo que te gusta

Origin blog.csdn.net/qq_38423256/article/details/128694119
Recomendado
Clasificación