项目中redis模糊查询使用了scan命令,在本地测试运行没有问题但部署到tomcat就会报错,错误显示redis值不是integer型或超出integer范围。代码和报错信息如下:
public List<Object> keys(String pattern) {
List<Object> keys = new ArrayList<>();
this.scan(pattern, item -> {
//符合条件的key
String key = new String(item, StandardCharsets.UTF_8);
keys.add(key);
});
return keys;
}
private void scan(String pattern, Consumer<byte[]> consumer) {
this.redisTemplate.execute((RedisConnection connection) -> {
try (Cursor<byte[]> cursor =
connection.scan(ScanOptions.scanOptions()
.count(Long.MAX_VALUE)
.match(pattern).build())) {
cursor.forEachRemaining(consumer);
return null;
} catch (IOException e) {
log.error("scan错误", e);
throw new RuntimeException(e);
}
});
}
io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range
at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:137)
at io.lettuce.core.internal.Exceptions.bubble(Exceptions.java:72)
at io.lettuce.core.internal.Futures.awaitOrCancel(Futures.java:250)
at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:75)
at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)
at com.sun.proxy.$Proxy148.scan(Unknown Source)
at org.springframework.data.redis.connection.lettuce.LettuceKeyCommands$1.doScan(LettuceKeyCommands.java:266)
at org.springframework.data.redis.connection.lettuce.LettuceScanCursor.scanAndProcessState(LettuceScanCursor.java:81)
at org.springframework.data.redis.connection.lettuce.LettuceScanCursor.doScan(LettuceScanCursor.java:56)
at org.springframework.data.redis.core.ScanCursor.scan(ScanCursor.java:88)
at org.springframework.data.redis.core.ScanCursor.doOpen(ScanCursor.java:123)
at org.springframework.data.redis.core.ScanCursor.open(ScanCursor.java:112)
at org.springframework.data.redis.connection.lettuce.LettuceKeyCommands.doScan(LettuceKeyCommands.java:277)
at org.springframework.data.redis.connection.lettuce.LettuceKeyCommands.scan(LettuceKeyCommands.java:245)
at org.springframework.data.redis.connection.DefaultedRedisConnection.scan(DefaultedRedisConnection.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.data.redis.core.CloseSuppressingInvocationHandler.invoke(CloseSuppressingInvocationHandler.java:61)
at com.sun.proxy.$Proxy568.scan(Unknown Source)
解决: 最终我是将connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(pattern).build()中的Long.MAX_VALUE改为了Integer.MAX_VALUE后方法就可以正常执行了