Implementación del bloqueo distribuido de Redis en un escenario de alta concurrencia
Para garantizar la disponibilidad de los bloqueos distribuidos, al menos debemos asegurarnos de que la implementación del bloqueo cumpla con las siguientes condiciones:
Según las condiciones anteriores, use set para expandir los parámetros a garantizar operaciones atómicas: configurar lock -key "lock-client" ex 10086 NX.
lock-key "lock-client" especifica el cliente de bloqueo, que se utiliza para juzgar al desbloquear.
EX 10010 especifica el tiempo de vencimiento.
NX solo establece la clave si la clave no existe. Su efecto es equivalente al comando SETNX.
Es solo que las primeras versiones de redis no admiten los parámetros extendidos de set, por lo que se requiere un script lua.
El bloqueo se puede realizar de forma atómica usando el comando set en versiones de gama alta, pero el desbloqueo no es posible y aún requiere un script Lua.
Redis introdujo la función de script Lua en la versión 2.6, lo que permite a los desarrolladores escribir scripts en lenguaje Lua y transferirlos a Redis para su ejecución. Los beneficios de usar scripts son los siguientes:
Es necesario determinar si el objeto bloqueado es el cliente actual después de obtener la clave de bloqueo. Si es así, desbloquéelo. El script Lua es el siguiente:
si redis.call('get ', KEYS[1]) == ARGV[1] entonces devuelve redis.call('del ', KEYS[1]) en caso contrario return 0 end
Modo de ejecución: eval;
Lista de parámetros de evaluación: eval Lua-script key-num[clave 1 clave 2 clave 3...][valor 1 valor 2 valor 3... .], análisis de parámetros:
Ejemplo de ejecución de evaluación: eval "redis.call ('set ', teclas [1], argv[1])" 1 Lua-key Lua-val;
Script de ejecución de desbloqueo completo:
eval "if redis.call('get ',KEYS[1]) == ARGV[1] y luego regresa redis.call('del ' ,KEYS[1 ]) De lo contrario, devuelve 0 end" 1 lock-key client-val
-End-