Inicio rápido Redis Calling Lua Scripts e introducción a escenarios de uso

Redis es una base de datos de memoria muy popular, que a menudo se utiliza para el almacenamiento en caché de datos y el almacenamiento de datos de alta frecuencia. La mayoría de los desarrolladores pueden haber oído que redis puede ejecutar scripts Lua, pero es posible que no sepan en qué circunstancias redis necesita utilizar scripts Lua.

1. Requisitos previos para leer este artículo

2. ¿Por qué necesita los scripts de Lua?

En resumen: los scripts de Lua aportan mejoras de rendimiento .

  • Muchas tareas de servicio de aplicaciones incluyen múltiples operaciones de redis y el uso de múltiples comandos de redis. En este momento, puede usar Redis combinado con scripts de Lua, lo que traerá un mejor rendimiento a su aplicación.
  • Además, el comando redis contenido en un script Lua es atómico.Cuando se enfrenta a operaciones de base de datos redis en escenarios de alta concurrencia, puede evitar eficazmente los datos sucios generados por operaciones multiproceso.

Tres, aprende algo de sintaxis de Lua

Habiendo dicho tanto, ¿qué hará Lua? ¡Que no cunda el pánico! Lua es realmente muy simple, si alguna vez has aprendido algún lenguaje de programación, aprender Lua es muy fácil. Déjame darte algunos ejemplos para que aprendas:

3.1. Un ejemplo sencillo

Los scripts de Lua se pueden invocar a través de clientes de redis en varios idiomas. Simplemente redis-cliusémoslo . Mire la línea de comando de redis a continuación:

eval "redis.call('set', KEYS[1], ARGV[1])" 1 key:name value

La línea de comando EVAL es seguida por un script Lua :, "redis.call('set', KEYS[1], ARGV[1])"puesto en el lenguaje de programación es una cadena, y los tres parámetros que siguen a la cadena del script Lua son:

  1. La cantidad de LLAVES requeridas por el script redis Lua es solo una CLAVES [1], por lo que el valor del parámetro inmediatamente después del script es 1
  2. El valor del parámetro del parámetro KEYS [1] requerido por el script Lua, en nuestro ejemplo el valor es clave: nombre
  3. El valor del parámetro del parámetro ARGV [1] requerido por el script Lua, en nuestro ejemplo el valor es valor

El script Lua incluye dos conjuntos de parámetros: KEYS [] y ARGV [] , los subíndices de las dos matrices comienzan desde 1. Una mejor práctica que vale la pena seguir es pasar la clave requerida para las operaciones de redis a través de KEYS como parámetros y pasar los parámetros requeridos por otros scripts de Lua a través de ARGV.

Una vez que se completa la ejecución del script anterior, usamos el siguiente script Lua para verificar. Si el valor de retorno del script es "valor", que es el mismo que el valor de key: name que establecimos antes, significa que nuestro El script Lua se ha ejecutado correctamente.

eval "return redis.call('get', KEYS[1])" 1 key:name

3.2. Eche un vistazo más de cerca al contenido del guión de Lua

Nuestro primer script de Lua contiene solo una declaración, llamandoredis.call

redis.call('set', KEYS[1], ARGV[1])

Entonces, en el script Lua, puede redis.callejecutar el comando redis. El primer parámetro del método de llamada es el nombre del comando redis. Debido a que estamos llamando al comando set de redis, necesitamos pasar la clave y los parámetros de valor.

Nuestro segundo script no solo ejecuta un script, porque ejecutar el comando get también devuelve el resultado de la ejecución. Tenga en cuenta que hay una palabra clave de retorno en el script.

eval "return redis.call('get', KEYS[1])" 1 key:name

Por supuesto, si es solo un script Lua simple como el anterior, es más conveniente usar la línea de comandos directamente. El script Lua que usamos será más complicado que el anterior El script Lua anterior es solo un Hello World.

3.3. Ejemplos de puntos complicados

He usado un script Lua para obtener los valores correspondientes a varias claves en un orden determinado de un mapa hash. El orden correspondiente se guarda en un conjunto de clasificación zset, y la configuración y clasificación de datos se puede completar de la siguiente manera.

# 设置hkeys为键Hash值
hmset hkeys key:1 value:1 key:2 value:2 key:3 value:3 key:4 value:4 key:5 value:5 key:6 value:6
# 建一个order为键的集合,并给出顺序
zadd order 1 key:3 2 key:1 3 key:2

Si no conoce la función de los comandos hmset y zadd, puede consultar hmset y zadd

Ejecute el siguiente script de Lua

eval "local order = redis.call('zrange', KEYS[1], 0, -1); return redis.call('hmget',KEYS[2],unpack(order));" 2 order hkeys

Verá la siguiente salida

“value:3”
“value:1”
“value:2”
  • Obtenga los datos de la colección de pedidos a través de zrange, a saber: [clave: 3, clave: 1, clave: 2]
  • Luego use la función de descomprimir para convertir [clave: 3, clave: 1, clave: 2] en clave: 3 clave: 1 clave: 2
  • Finalmente ejecute hmget hkeys key: 3 key: 1 key: 2, por lo que se obtiene el resultado de salida anterior

Cuatro, precarga del script Lua

Redis puede precargar scripts de Lua y los scripts de Lua se pueden precargar en redis a través del comando de carga de script.

script load "return redis.call('get', KEYS[1])"

Una vez completada la precarga, verá el siguiente resultado

“4e6d8fc8bb01276962cce5371fa795a7763657ae”

Esta es una cadena hash única. Este hash representa el script Lua que acabamos de precargar. Podemos ejecutar el script a través del comando EVALSHA . Tal como:

evalsha 4e6d8fc8bb01276962cce5371fa795a7763657ae 1 key:name

El resultado de la ejecución es consistente con lo siguiente.

eval "return redis.call('get', KEYS[1])" 1 key:name

5. ¿Un ejemplo de modificación de datos JSON?

Algunos desarrolladores pueden guardar datos JSON en Redis a veces. No digamos si es una buena manera. Hablemos de cómo modificar datos JSON a través de scripts Lua.

En circunstancias normales, debe modificar un objeto JSON, debe consultarlo desde redis, analizarlo, modificar el valor de la clave y luego serializarlo y guardarlo en redis. Hay varios problemas con esto:

  1. En escenarios de alta concurrencia, no se puede garantizar la atomicidad. Otro subproceso puede cambiar estos datos JSON entre la adquisición del subproceso actual y la configuración de las operaciones de objeto. En este caso, se perderá la actualización.
  2. Problemas de desempeño. Si realiza estos cambios con frecuencia y los datos JSON son bastante grandes, esto puede convertirse en un cuello de botella de rendimiento para la aplicación. Porque usted obtiene y almacena datos con frecuencia.

Al implementar la lógica anterior en Lua, debido a que el script Redis Lua se ejecuta en el lado del servidor, por un lado, puede garantizar la atomicidad de las operaciones y resolver el problema de las actualizaciones perdidas de alta concurrencia. Por otro lado, ahorra la red transmisión y mejora el rendimiento.

A continuación, guardamos una cadena JSON de prueba en redis:obj

set obj '{"a":"foo","b":"bar"}'

Ahora, ejecutemos nuestro script:

EVAL 'local obj = redis.call("get",KEYS[1]); local obj2 = string.gsub(obj,"(" .. ARGV[1] .. "\":)([^,}]+)", "%1" .. ARGV[2]);  return redis.call("set",KEYS[1],obj2);' 1 obj b bar2
  • local obj = redis.call("get",KEYS[1]); Donde KEYS [1] = obj, por lo que el valor de retornoobj= '{"a":"foo","b":"bar"}'
  • local obj2 = string.gsub(obj,"(" .. ARGV[1] .. "\":)([^,}]+)", "%1" .. ARGV[2]);, ..Es el símbolo de concatenación de cadenas del script Lua; usamos el patrón RegEx para hacer coincidir la clave y reemplazar su valor. Si no está familiarizado con la expresión, cree su propia lección; "% 1" significa la primera subcadena coincidente, "% 1 ".. ARGV [2] es igual a" b ":" bar2 ", y use gsub para reemplazarlo.
  • Finalmente, se devuelve objel resultado y el resultado del objeto JSON es el siguiente:
{"a":"foo","b":"bar2"}

Seis, resumen

Recomiendo usar scripts de Lua solo si puede demostrar que puede brindar un mejor rendimiento. Si solo desea garantizar la atomicidad de las operaciones de redis, puede usar transacciones . No es necesario utilizar los scripts de Lua.

Además, el script redis Lua no debería ser demasiado largo. Porque cuando el script se está ejecutando, equivale a bloquear el objeto operado, y otras operaciones están esperando a que se complete. Si el script Lua tarda una cantidad considerable de tiempo en ejecutarse, puede causar un cuello de botella en lugar de mejorar el rendimiento. El script Lua se detiene después de que se alcanza el tiempo de espera (5 segundos por defecto).

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

Origin blog.csdn.net/hanxiaotongtong/article/details/114110225
Recomendado
Clasificación