参考文档 https://blog.youkuaiyun.com/yan_dk/article/details/89643763
lua的环境安装及入门可参考上述文档。
为什么要引入lua脚本?
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
redis是单线程的,每执行一次redis,都会有脚本缓存,如果执行过多redis操作指令,会非常消耗内存。那么引入高性能的lua脚本,可以将批量的redis操作交给lua完成,这样会降低内存消耗,优化性能。lua作为一种不同语言程序的粘合剂,起到了优势互补的作用。就像数据库的存储过程。
下面介绍,redis使用lua的技巧。
1. redis中使用eval指令可以执行lua脚本,如下
红字标识的“” eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second“就是执行lua脚本。
"return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 是被求值的 Lua 脚本,数字 2 指定了键名参数的数量, key1 和 key2 是键名参数,分别使用 KEYS[1] 和 KEYS[2] 访问,而最后的 first 和 second 则是附加参数,可以通过 ARGV[1] 和 ARGV[2] 访问它们。
PHP中使用redis拓展执行脚本时,eval方法的参数 3个,第一个是脚本代码,第二个是一个数组,参数数组,第三个参数是个整数,表示第二个参数中的前几个是key参数,剩下的都是附加参数。
2. php中redis调用lua脚本
<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->auth('123456');
$lua = <<<SCRIPT
redis.call('set',KEYS[1],ARGV[1]); redis.call('set',KEYS[2],ARGV[2]);
return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}
SCRIPT;
//对应的redis命令如下 eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
$s = $redis->eval($lua,array('key1','key2','first','second'),2);
$redis->set('testkey','123');
var_dump($s);
返回结果:key1 key2 first second的字符串序列化
上述php文件,基本实现情景是可以将请求参数传递过去,在redis中调用lua脚本执行可以缓存指定的键值对。直接在php环境中运行即可得到结果。
点评:redis缓存将存储2个键值对,key1=>first,key2=>second,以此类推。这样我们通过lua脚本作为函数,原子化批量赋值,执行效率更高。
$lua = <<<eof
local res = KEYS[1];
local res2 = ARGV[1];
return res..'---'..res2;
eof;
$arr = ['test2','test3'];
$res = $redis->eval($lua,$arr,1);
var_dump($res);
返回结果test2---test3
lua脚本的连接字符串代码为..,这个和php有区别,需要注意。
本文持续修改完善...