分佈式鎖redisson依賴了特定的spring boot版本,如果版本不兼容就可能出現問題
問題 - 遞歸循環
java.lang.StackOverflowError
at org.springframework.data.redis.connection.DefaultedRedisConnection.zAdd(DefaultedRedisConnection.java:863)
at org.springframework.data.redis.connection.DefaultedRedisConnection.zAdd(DefaultedRedisConnection.java:863)
at org.springframework.data.redis.connection.DefaultedRedisConnection.zAdd(DefaultedRedisConnection.java:863)
at org.springframework.data.redis.connection.DefaultedRedisConnection.zAdd(DefaultedRedisConnection.java:863)
問題起源
org.springframework.data.redis.connection.DefaultedRedisConnection
@Override
@Deprecated
default Boolean zAdd(byte[] key, double score, byte[] value) {
return zSetCommands().zAdd(key, score, value);
}
org.springframework.data.redis.connection.RedisConnection
default RedisZSetCommands zSetCommands() {
return this;
}
是因爲zSetCommands()一直返回this,然後遞歸調用自身的zAdd方法,引起棧溢出
版本衝突
- spring-boot版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
- redisson版本
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.4</version>
</dependency>
解決辦法
升級spring-boot版本到2.5.7及以上或者redisson降級到3.15.6
版本匹配,可以在redisson-spring-boot-starter中確認依賴的spring-boot版本