Lua入门及技术指南之2

参考文档

https://blog.csdn.net/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有区别,需要注意。 

 

 

本文持续修改完善...

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云焰

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值