看到底层Redis.php给出如下示例:

/** 
* Set the string value in argument as value of the key. 
* 
* @param   string  $key 
* @param   string  $value 
* @param   int   $timeout [optional] Calling setex() is preferred if you want a timeout. 
* @return  bool    TRUE if the command is successful. 
* @link    http://redis.io/commands/set 
* @example $redis->set('key', 'value'); 
*/
public function set( $key, $value, $timeout = 0 ) {}

然后在应用中封装RedisService.php的时候,重写了

set方法:

 /**
     * @param $key
     * @param $val
     * @param int $timeout
     * @return mixed
     */
    public function set($key, $val, $timeout =0)
    {
        return $this->redis->set($this->prepareKey($key), $val, $timeout);
    }

仅仅只是透传了 timeout。

然后,项目中的set redis操作都无法做了,最后排查发现原因:

set方法第三个参数传入时,底层会默认调用 setex()方法,

 public function setex( $key, $ttl, $value ) {}


而ttl参数为0时,会报错。

如果set方法不传入第三个参数时,默认执行set方法,过期时间是永久不过期。

奇葩的玩法...