¿Redis tiene un lenguaje de secuencias de comandos?
Sí, lenguaje de script lua
Script de Redis
Beneficios de usar scripts:
Reduce la sobrecarga de la red. Se pueden enviar varias solicitudes a la vez en forma de script para reducir la latencia de la red
Operaciones atómicas. Redis ejecutará todo el script en su totalidad y no se insertará ningún otro comando en el medio. Por lo tanto, no hay necesidad de preocuparse por las condiciones de carrera al escribir scripts y no es necesario utilizar transacciones.
Reutilizar. Los scripts enviados por el cliente se almacenarán permanentemente en redis, de modo que otros clientes puedan reutilizar estos scripts sin usar código para completar la misma lógica.
Sintaxis para llamar al script Lua:
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2 ] ...
--eval, le dice a redis-cli que lea y ejecute el siguiente script Lua
ruta/a/redis.lua, es la ubicación del script Lua
KEYS[1] KEYS[2] es la clave que se utilizará. Puede especificar varias claves. Se obtiene a través de KEYS[1], KEYS[2] en el script lua.
ARGV[1] ARGV[2], parámetros, obtenidos mediante ARGV[1], ARGV[2] en script Lua.
Nota:
Los espacios a ambos lados de ',' entre KEYS y ARGV no se pueden omitir.
Redis admite la mayoría de las bibliotecas estándar de Lua
Nombre de la biblioteca
Descripción
La base proporciona algunas funciones básicas
Cadena proporciona funciones para operaciones de cadenas
Tabla proporciona funciones para operaciones de tablas
Math proporciona funciones de cálculo matemático
Depuración proporciona funciones para depurar
Llamar el comando redis en el script
En el script, puede usar la función redis.call para llamar al comando Redis redis.call('set', 'foo', 'bar') valor local =redis .call('get', 'foo'): el valor del valor es bar
El valor de retorno de la función redis.call es el resultado de la ejecución del comando Redis
El resultado del comando Redis Hay 5 tipos de valores de retorno. La función redis.call convertirá estos 5 tipos de respuestas en los tipos de datos de Lua correspondientes. Las reglas correspondientes específicas son las siguientes (el resultado vacío es especial y corresponde a Lua). false)
tipo de valor de retorno de redis y reglas de conversión de tipo de datos de Lua
tipo de valor de retorno de redis
tipo de datos de Lua
Respuesta entera numérica tipo
Tipo de cadena de respuesta de cadena
Tipo de tabla de respuesta de cadena de varias líneas (formato de matriz)
Tipo de tabla de respuesta de estado (solo un campo ok almacena información de estado)
Tipo de tabla de respuesta de error (solo un campo de error almacena información de error)
Redis también proporciona la función redis.pcall, que tiene la misma función que redis.call La única diferencia es. que cuando ocurre un error durante la ejecución del comando, redis.pcall registrará el error y continuará la ejecución, mientras que redis.call devolverá directamente un error y no continuará la ejecución.
Puede utilizar la declaración de devolución en el script para devolver el valor al cliente. Si la declaración de devolución no se ejecuta, se devolverá nil de forma predeterminada
Tipo de datos Lua y redis. Reglas de conversión de tipo de valor de retorno
Tipo de datos Lua
Tipo de valor de retorno de Redis
Respuesta de tipo numérico entero (el tipo numérico de Lua se convertirá automáticamente en un número entero)
Tipo de cadena respuesta de cadena
tipo de tabla (formulario de matriz) respuesta de cadena de varias líneas
tipo de tabla (solo un campo ok almacena información de estado) respuesta de estado p>
Tipo de tabla (solo un campo err almacena información de error) Respuesta de error
Comandos relacionados con script
EVAL "lua-script" [clave...] [arg . ..]
Transfiera datos al script a través de parámetros clave y arg, y se accede a sus valores en el script utilizando variables globales de los dos tipos de tabla KEYS y ARGV respectivamente.
Nota: El comando EVAL almacena todos los parámetros posteriores en el script de acuerdo con el parámetro de número clave en dos variables globales de tipo tabla, KEYS y ARGV. Cuando el script no requiere ningún parámetro, este parámetro no se puede omitir (establecer en 0) redis>EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar
OK
redis>GET foo "bar"
Comando EVALSHA
Cuando el script es relativamente largo, si es necesario llamar al script completo cada tiempo Pasar el script a Redis consumirá más ancho de banda. Para resolver este problema, Redis proporciona el comando EVALSHA, que permite a los desarrolladores ejecutar scripts a través del resumen SHA1 del contenido del script. El uso de este comando es el mismo que EVAL, excepto que el contenido del script se reemplaza con el resumen SHA1. del contenido del guión.
Cuando Redis ejecuta el comando EVAL, calculará el resumen SHA1 del script y lo registrará en el caché del script. Al ejecutar el comando EVALSHA, Redis buscará el contenido del script correspondiente en el caché del script. en el resumen proporcionado, si lo encuentra, ejecute el script; de lo contrario, se devolverá un error: "NOSCRIPT No hay script coincidente. Utilice EVAL".
El proceso general de uso del comando EVALSHA en el programa es el siguiente. sigue.
Aunque este proceso es un poco engorroso, afortunadamente, los clientes de Redis en muchos lenguajes de programación completarán este proceso en nombre de los desarrolladores. Al ejecutar el comando EVAL, intente ejecutar el comando EVALSHA primero. Si falla, se ejecutará el comando EVAL.
Primero calcule el resumen SHA1 del script y ejecútelo usando el comando EVALSHA.
Obtenga el valor de retorno. Si se devuelve un error "NOSCRIPT", utilice el comando EVAL para volver a ejecutar el script.
SCRIPTLOAD "lua-script"
Agrega el script al caché pero no lo ejecutas. Devuelve: resumen SHA1 del script
SCRIPT EXISTS lua-. script-sha1
Determinar si el script se ha almacenado en caché
SCRIPT FLUSH
Borrar el caché del script Después de redis, se agrega el resumen SHA1 del script al script. caché, se conservará permanentemente y no se eliminará, pero puede usar manualmente el comando SCRIPT FLUSH para almacenar en caché el script.
SCRIPT KILL
Forzar la finalización de la ejecución del script actual. Sin embargo, si el script actualmente ejecutado escribe datos de Redis, el comando SCRIPT KILL no finalizará el script para evitar que solo se ejecute una parte del mismo. Todos los comandos del script se ejecutan o no se ejecuta ninguno.
La ejecución del script de Redis es atómica, es decir, Redis no ejecutará otros comandos durante la ejecución del script. Todos los comandos deben esperar a que se complete la ejecución del script antes de poder ejecutarlos. Para evitar que Redis no pueda proporcionar servicios debido a que un script tarda demasiado en ejecutarse (como caer en un bucle infinito), Redis proporciona el parámetro lua-time-limit para limitar el tiempo máximo de ejecución del script. que por defecto es 5 segundos. Cuando el tiempo de ejecución del script excede este límite, Redis comenzará a aceptar otros comandos pero no los ejecutará (para garantizar la atomicidad del script, porque el script no finaliza en este momento), pero devolverá un error "OCUPADO"