共计 555 个字符,预计需要花费 2 分钟才能阅读完成。
redis 的自增操作没有原生的设置过期工夫,只能先自增而后通过 expire 设置过期工夫,若呈现非凡状况导致设置过期工夫失败,则会导致业务谬误。
上面是基于 PHP 和 LUA 脚本编写一个 DEMO,使自增和过期工夫成为原子操作,从而防止上述问题。
<?php
$redis = new Redis();
$result = $redis->connect('127.0.0.1');
$lua = <<<LUA
local key,ttl=KEYS[1],KEYS[2]
if redis.call('EXISTS',key)==0 then
redis.call('SETEX',key,ttl,1)
return 1
else
return tonumber(redis.call('INCR',key))
end
LUA;
$sequence = $redis->eval($lua,["test",10],2); // eval 函数请查问官网阐明文档
var_dump("RES:".$sequence);
$error = $redis->getLastError();
if($error){var_dump($error);
}
var_dump("VAL:".$redis->get("test"));
var_dump("TTL:".$redis->ttl("test"));
正文完