REDIS自增INCR设置过期时间的原子操作(LUA&PHP实现)

hellcox

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

阅读 104

我愿代替她的双眼,看繁花似锦云卷云舒;我愿成为她的双脚,踏遍天涯海角山川万里。

2 声望
0 粉丝
0 条评论
你知道吗?

我愿代替她的双眼,看繁花似锦云卷云舒;我愿成为她的双脚,踏遍天涯海角山川万里。

2 声望
0 粉丝
宣传栏