0
点赞
收藏
分享

微信扫一扫

Redis-Cli 运行lua脚本

进击的包籽 2022-04-03 阅读 127
phpredislua

我当前lua脚本在 /www/wwwroot/redis.lua 中

代码如下:

根据key获取一个值 , 当条件成立时产出这个key

 local key=KEYS[1]
local value=ARGV[1]


if(redis.call('get', key) == value)
then
return redis.call('del', key)
end

如果在redis-cli中 是无法打开这个文件的

所以应该命令行中运行

redis-cli --eval /www/wwwroot/redis.lua  'swoft:lock1' , 's:9:"goods_id1";' 

注意的地方:

  • eval 后面参数是lua脚本文件,.lua后缀
  • 不用写numkeys,而是使用,隔开。注意,前后有空格。

我这个例子是swoft框架 , 值不一样

 

 public function redis()
{
$count = 0; // 重试次数
$max_count = 3; // 最大重试次数
$status = true;
while ($status){
$count++;
if ($count > $max_count) $status=false;
if ($status == false) return "您的网络不佳,稍后重试吧".$count.$status;
$good_id = 1;
$key = 'lock'.$good_id;
$value = 'goods_id'.$good_id;
$lock_status = Redis::exists($key);
if (!$lock_status){
$lock_time = 500;
$lock = Redis::set($key, $value,$lock_time); // 设置锁并且设置过期时间
if ($lock){ // 加锁成功
// TODO 业务操作

// 业务执行后存在锁,删除锁
$script = <<<LUA
local key=KEYS[1]
local value=ARGV[1]
if(redis.call('get', key)==value)
then
return redis.call('del', key)
end
LUA
;
Redis::eval($script,['swoft:'.$key ,'s:9:"goods_id1";'],1);
return '抢购成功!!!!!!!!!!!';
}else{ // 有人使用锁 , sleep ,等待重新尝试获取锁
sleep(1);
}
}else{ // 有人使用锁 , sleep , 等待重新尝试获取锁
sleep(1);
}
}


}
举报

相关推荐

0 条评论