1.在Redis中使用Lua编程的优点
高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用LUA脚本可以用一个请求完成
数据可靠性:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
复用性:LUA脚本执行后会永久存储在Redis服务器端,其他客户端可以直接复用
便捷性:实现程序热更新
可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互
简单强大:小巧轻便,资源占用率低,支持过程化和对象化的编程语言
免费开源:遵循MIT Licence协议,可免费商用化
2.Lua语言简单介绍
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua变量:Lua 变量有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。变量的默认值均为 nil。
Lua语言的数据类型:
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()