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本身不支持同时设置过期,两种实现方式:
- Redis版本≥6.2时,直接使用带
GET参数的SET命令,单命令原子完成所有操作:
// 等价于GETSET的效果,同时支持设置过期时间,返回旧值 $oldValue = Redis::set('access-token', '<value>', 'EX', 10, 'GET');
- 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
相关产品推荐
相关产品推荐

