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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理