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