关于redis:REDIS自增INCR设置过期时间的原子操作LUAPHP实现

40次阅读

共计 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"));

正文完
 0