You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Redis getset报SELECT失败值非整数或超范围错误如何解决

Redis调用报错ERR value is not an integer or out of range排查

问题原因

  • 命令用法错误:原生Redis的GETSET命令仅支持2个参数,语法为GETSET key value,作用是为指定key设置新值,同时返回该key的旧值,原生不支持EX/PX/NX/XX等SET命令支持的扩展参数,错误把SET命令的传参规则套用到GETSET上是核心诱因。
  • 参数错位触发报错:由于传入GETSET的参数数量不符合预期,Laravel Redis门面或phpredis扩展解析参数时出现错位,将字符串类型的'EX'误识别为SELECT命令要求的整数型数据库编号,因此抛出"value is not an integer or out of range"的错误。

对应解决方法

根据实际业务需求二选一即可:

需求1:原子性实现「设置新值+返回旧值+设置过期时间」

GETSET本身不支持同时设置过期,两种实现方式:

  1. Redis版本≥6.2时,直接使用带GET参数的SET命令,单命令原子完成所有操作:
// 等价于GETSET的效果,同时支持设置过期时间,返回旧值
$oldValue = Redis::set('access-token', '<value>', 'EX', 10, 'GET');
  1. Redis版本低于6.2时,用Redis事务保证操作原子性:
$oldValue = Redis::transaction(function ($redis) {
    // 先取旧值
    $old = $redis->getset('access-token', '<value>');
    // 再设置10秒过期
    $redis->expire('access-token', 10);
    return $old;
});

需求2:不需要返回key的旧值,仅需设置带过期时间的键值

直接使用标准SET命令即可,不要调用GETSET:

// 设置access-token值,10秒后自动过期
Redis::set('access-token', '<value>', 'EX', 10);

内容的提问来源于stack exchange,提问作者MiyRon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:57:29