public function set($value, $seconds = null, $milliseconds = null, $exist = null): ?bool
    {
        if ($value === null) {
            return $this->delete();
        }

        return $this->redis->set($this->key, $this->serialize($value), $seconds, $milliseconds, $exist) === true;
    }
public function set($value, $seconds = null, $milliseconds = null, $exist = null): ?bool
    {
        if ($value === null) {
            return $this->delete();
        }

        return $this->redis->set($this->key, $this->serialize($value), $seconds, $milliseconds, $exist) === true;
    }
@param mixed       $value                                    Null deletes the value - everything else is
serialized and set.

@param null|int    $seconds                                  Optional expiration time in seconds.
@param null|int    $milliseconds                             Optional expiration time in milliseconds.
@param null|string $exist                                    See self::FLAG_* for possible flags. (ADD, UPDATE)

@return bool|null True if operation was successful. Null in case a flag caused the operation to fail (e.g. key
already existent).

Note: I have no idea why not to use false instead of null. But that's what the client reports.