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实现)的主要内容,如果未能解决你的问题,请参考以下文章

基于Redis的INCR实现一个限流器

Redis过期时间

使用RedisAtomicLong和redisTemplate实现redis的计数器INCR原子加

redis计数器,怎么样保证取值正确

jedis连接池详解(Redis)

(转) Redis学习教程--基本命令