我当前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);
}
}
}