node.js在Redis中执行LUA脚本报错:ERR value is not an integer

本文探讨了在使用Redis的evalsha命令时遇到的一个常见错误:ERR value is not an integer or out of range。该错误通常发生在没有正确指定参数数量的情况下。文章通过具体的示例展示了如何避免这一错误,并给出了正确的调用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(error) ERR value is not an integer or out of range
这个错误的原因在于调用是没有制定参数的个数,所以出现解析参数个数时出现范围问题.

假设调用一个脚本,一个参数:

#redis-cli evalsha 643ae8e4fa979df58a8cd2f6ab4d46f3e16ace5e 0x61c808d82a3ac53231750dadc13c777b59310bd9 "{\"balance\":\"5000000000000000000\",\"txs\":0,\"flag\":0,\"type\":0}"
(error) ERR value is not an integer or out of range

// 如下方式调用正常,注意hash脚本后面的**1**表示一个参数
redis-cli evalsha 643ae8e4fa979df58a8cd2f6ab4d46f3e16ace5e 1 0x61c808d82a3ac53231750dadc13c777b59310bd9 "{\"balance\":\"5000000000000000000\",\"txs\":0,\"flag\":0,\"type\":0}"

node.js调用如下:

redisCli.evalsha([self.config.addressLuaHash, 1, contractAddr, JSON.stringify(addr)], function(err){
    if (logger.isTraceEnabled){
        logger.trace("save address account to redis:", addr);
    }
    callback(err);
});
如果在使用 Spring Data Redis 的 `increment` 方法进行自增操作时,出现了 `ERR value is not an integer or out of range` 的错误,可能是因为 Redis 对应的键存储的值不是整数类型,或者存储的整数值超出了 Redis 数据类型的范围。 为了解决这个问题,你可以在调用 `increment` 方法之前,先使用 RedisTemplate 的 `type` 方法获取 Redis 对应键的数据类型,如果是字符串类型,就尝试将其转换为整数类型。如果转换失败,就抛出异常或者返回错误信息,避免出现 `ERR value is not an integer or out of range` 的错误。 示例代码如下: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public Long incrementCounter(String key, long delta) { DataType dataType = redisTemplate.type(key); if (dataType == DataType.STRING) { Object value = redisTemplate.opsForValue().get(key); if (value == null) { redisTemplate.opsForValue().set(key, delta); return delta; } else { try { Long longValue = Long.parseLong(value.toString()); return redisTemplate.opsForValue().increment(key, delta); } catch (NumberFormatException e) { throw new RuntimeException("Value is not an integer: " + value); } } } else { throw new RuntimeException("Key is not a string: " + key); } } ``` 上述代码,`redisTemplate` 是一个已经通过 Spring 配置注入的 RedisTemplate 对象,泛型参数 `<String, Object>` 表示 Redis 键名和键值的数据类型。`incrementCounter` 方法接受一个键名和自增步长,首先使用 `type` 方法获取 Redis 对应键的数据类型,如果是字符串类型,就尝试将其转换为整数类型。如果转换失败,就抛出异常或者返回错误信息;如果转换成功,就调用 `increment` 方法实现自增操作,并返回自增后的结果。如果键名对应的数据类型不是字符串类型,也会抛出异常或者返回错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值