如何在Redis中使用Lua编程?

163 阅读2分钟

1.在Redis中使用Lua编程的优点

高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用LUA脚本可以用一个请求完成

数据可靠性:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。

复用性:LUA脚本执行后会永久存储在Redis服务器端,其他客户端可以直接复用

便捷性:实现程序热更新

可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互

简单强大:小巧轻便,资源占用率低,支持过程化和对象化的编程语言

免费开源:遵循MIT Licence协议,可免费商用化

2.Lua语言简单介绍

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。       
Lua变量:Lua 变量有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。变量的默认值均为 nil

Lua语言的数据类型:

11.png

22.png

3.如何在Redis中使用Lua编程

1.使用eval方式

2.使用evalsha方式

4.在Redis中使用Lua到底解决了什么问题

1.原子化问题

2.Redis服务端无法计算的问题

3.效率问题

5.在Redis中使用Lua编程的代码

import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

public class Test3 {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");
        jedis.select(0);
        List<String> keys = new ArrayList<>();
        List<String> args1 = new ArrayList<>();
        String lua = "for i1, v1 in ipairs(KEYS) do\n" +
                "\n" +
                "\t\tredis.call('SET', v1, ARGV[i1])\n" +
                "\t\n" +
                "\t\n" +
                "end";
        String hash = jedis.scriptLoad(lua);

        // String hash="b607ceb35d1d81997f48f3a98b61adba7f3d4d7c";
        for (int i = 0; i < 100; i++) {
            keys.add("zhangsan" + i);
            args1.add("lisi" + i);

        }
        // System.out.println(hash);
        long start = System.currentTimeMillis();
        Object o = jedis.evalsha(hash, keys, args1);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        jedis.close();


    }
}
import java.util.ArrayList;
import java.util.List;

public class Test4 {


    public static void main(String[] args) {

        testLua();
    }

    public static void testLua() {
        Jedis jedis = new Jedis("localhost");
        jedis.select(0);
        List<String> keys = new ArrayList<String>();
        List<String> args1 = new ArrayList<String>();
        String lua = "redis.call('SELECT', '8')\n" +
                "redis.call('INCR', 'xd')\n" +
                "local xd =redis.call('GET', 'xd')\n" +
                "return xd";
        Object o = jedis.eval(lua,  keys, args1);
        String aa = (String) o;
        System.out.println(aa);
        jedis.close();
    }
}

Lua脚本

local function flushDB()
    redis.call('FLUSHDB')
end

local function setValue()
    redis.call('set', 'xd111', 'xd890')
end

flushDB()
setValue()