REDIS自增INCR设置过期时间的原子操作(LUA&PHP实现)
Posted hellcox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了REDIS自增INCR设置过期时间的原子操作(LUA&PHP实现)相关的知识,希望对你有一定的参考价值。
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"));
以上是关于REDIS自增INCR设置过期时间的原子操作(LUA&PHP实现)的主要内容,如果未能解决你的问题,请参考以下文章