原创 php如何使用redis执行lua脚本?

php redis lua
IT技术 · phper · 更新于 2019-03-23

Lua 是一种轻量小巧的脚本语言 ,可以提高性能。

在PHP中使用redis来执行lua脚本,示例代码如下(代码功能:限流,在特定情况下限制页面访问的流量)

class FlowLimiter  //在这个类中定义一个Lua脚本
{

const LUA_SCRIPT = <<<LUA_SCRIPT
local cnt = redis.call("incr", KEYS[1]) //执行call 也就是执行redis 中的incr方法(值加一),带入参数KEYS[1]
local maxCnt = tonumber(ARGV[1]) //tonumber 进制转换, 第一个参数是转换的值, 第二个参数是转换为几进制,默认为10进制
local expireTime = tonumber(ARGV[2])
if cnt==1 then
redis.call("expire", KEYS[1], expireTime) //设置过期时间
end

if cnt>maxCnt then //大于限制的访问值 时候 减去一后,限制访问,直到String类型的 键名为KEYS[1] 过期 重新不限制访问
redis.call("decr", KEYS[1]) //执行call 也就是执行redis 中的decr方法(值减一), 对键名为KEYS[1] 的值减去一 return -1
end
return cnt
LUA_SCRIPT;

public function limiter(){

//通过redis 对象操作evalScript来执行lua脚本,这边传入了三个参数,第一个参数是执行的脚本,第二个参数是数组,第三个参数是数值,也就是说数值为多少就相当于有多少个KEYS

//比如数值为1的时候就只有KEYS[1] 如果为2 那么有KEYS[1] KEYS[2],那么就对应第二个参数中的数组的元素,其余的参数为ARGV[1]开始的数组

//下面代码示例, 数值为1 那么数组中$key相当于 KEYS[1] 剩下的都为ARGV数组,$maxCnt为ARGV[1],$interval为ARGV[2]

$ret = $this->getRedis()->evalScript(self::LUA_SCRIPT, [$key, $maxCnt, $interval], 1);

} ...多余的代码 }


|0 收藏|0

思考你要发的内容