guión Redis avanzada -lua

Aquí Insertar imagen Descripción


Pre

Redis 2.6 introdujo una característica de secuencias de comandos que permite a los desarrolladores usar lenguaje de script Lua propagación Redis ejecutado.


gramática

Desde la versión Redis2.6.0, una función de Lua intérprete, scripts Lua pueden ser evaluados usando el comando EVAL.

Formato del comando EVAL es el siguiente:

EVAL script numkeys key [key ...] arg [arg ...]
  • parámetro de guión es una pieza de escritura Lua, que se llevará a cabo en el contexto del servidor Redis, este script no lo hace (y no debe) ser definida como una función Lua.

  • Numkeys parámetro especifica el número de parámetros claves

  • Tecla de parámetro de nombre [clave ...] de la tercera fecha de inicio parámetro EVAL, indican que la clave Redis (clave) en la secuencia de comandos se utilizan, estos parámetros pueden ser claves claves conjunto de variables globales en Lua, con 1 en forma de dirección de base de acceso (teclas [1], teclas [2], y así sucesivamente)

  • Al final, los parámetro adicional no es la clave parámetro de nombre de arg comando [arg ...], variable de acceso a una matriz ARGV se puede acceder a través de la forma global en Lua y variables TECLAS similares (ARGV [1], ARGV [2], y así sucesivamente)

por ejemplo

127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 value1 value2
1) "key1"
2) "key2"
3) "value1"
4) "value2"
127.0.0.1:6379> 

Kazajstán debe estar en mayúsculas, minúsculas de error.

127.0.0.1:6379> EVAL "return {keys[1],keys[2],argv[1],argv[2]}" 2 key1 key2 value1 value2
(error) ERR Error running script (call to f_8cfd66635a33779a52579a216e55263704ce398a): @enable_strict_lua:15: user_script:1: Script attempted to access nonexistent global variable 'keys' 
127.0.0.1:6379> 

En el que "retorno {teclas [1], TECLAS [2], argv [1], argv [2]}" es escritura Lua se evalúa, numeral 2 especifica el número del nombre de clave del parámetro, key1 y key2 es la clave para el parámetro , respectivamente, utilizando las teclas [1] y teclas [2] para el acceso y el último valor1 y valor2 son parámetros adicionales pueden argv [1] y aRGV [2] para acceder a ellos.


jedis operación lua

En el guión Lua, puede utilizar redis.call () para ejecutar el comando Redis

public class JedisSingleTest {
    public static void main(String[] args) throws IOException {

        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);

        // timeout,这里既是连接超时又是读写超时,从Jedis 2.8开始有区分connectionTimeout和soTimeout的构造函数
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.18.130", 6379, 3000, null);

        Jedis jedis = null;
        try {
            //从redis连接池里拿出一个连接执行命令
            jedis = jedisPool.getResource();

            //******* lua脚本示例 ********
            //模拟一个商品减库存的原子操作
            //lua脚本命令执行方式:redis-cli --eval /tmp/test.lua , 10
            jedis.set("product_stock_10016", "15");  //初始化商品10016的库存

            // lua脚本
            String script = " local count = redis.call('get', KEYS[1]) " +
                            " local a = tonumber(count) " +
                            " local b = tonumber(ARGV[1]) " +
                            " if a >= b then " +
                            "   redis.call('set', KEYS[1], count-b) " +
                            //模拟语法报错回滚操作"   bb == 0 " +
                            "   return 1 " +
                            " end " +
                            " return 0 ";
            // eval调用, 第一个参数为 KEYS[1]) , 第二个参数为ARGV[1]
            Object obj = jedis.eval(script, Arrays.asList("product_stock_10016"), Arrays.asList("10"));
            System.out.println(obj);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
            if (jedis != null)
                jedis.close();
        }
    }
}

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción


beneficio

  • Reducir sobrecarga de la red

    Suponga que tiene tres comandos a ejecutar, tenía tres veces el costo de la red, utilizando lua puede solicitar un completo, lógicas solicitados originalmente tres veces en el servidor Redis al completo. El uso de un script, reduce red de retardo de ida y vuelta. Esto es similar con la tubería.

  • operación atómica

    Redis guión completo en su conjunto llevará a cabo, no va a ser insertado en el medio de otros comandos. El conducto no atómica, pero Redis comando de operación por lotes (MSET similar) es atómica.

  • REDIS función de transacción alternativa

    Redis función propios asuntos es muy triste, no son compatibles con el error de reversión, y el script lua Redis casi logra capacidades transaccionales normales para apoyar el error reversión, el oficial se recomienda si desea utilizar Redis función de transacción puede ser reemplazado por Redis lua.


combate lua

Alta concurrencia - agarrar un sobre rojo [caso] 4: Uso del Redis + Lua script de implementación asíncrona agarrar un sobre rojo y persistió a la base de datos


precauciones

Tenga en cuenta que el ciclo de la muerte y las operaciones que consumen mucho tiempo no aparecen en la secuencia de comandos Lua, de lo contrario, se bloqueará Redis, no aceptará otros comandos, por lo que prestar atención cuando se utiliza no es un bucle infinito, operación que consume tiempo.

redis es un solo proceso, la ejecución de un solo roscada del script. Ducto no bloquea Redis.

Publicados 831 artículos originales · ganado elogios 2074 · Vistas 4,23 millones +

Supongo que te gusta

Origin blog.csdn.net/yangshangwei/article/details/105377458
Recomendado
Clasificación