Spring boot + TongRDS 报错ERR ERR the number of keys maybe greater than Server, Common MaxItems(10000)

1、在xxx/pmemdb/etc目录下修改 cfg.xml文件

增加<MaxItemsReturned>0</MaxItemsReturned>不限制

<Server>
    <Common>
        ...
        <MaxItemsReturned>0</MaxItemsReturned>
    </Common>
</Server>

<think>我们正在解决Spring Boot启动时因Redis命令`CONFIG`被禁用而导致的错误。根据引用[1]和[2],该错误通常发生在生产环境,因为云服务提供商出于安全考虑禁用了`CONFIG`命令。Spring Boot的Redis自动配置会尝试执行`CONFIG GET notify-keyspace-events`来配置键空间事件通知,当该命令被禁用时就会抛出异常。 解决方案的核心是避免Spring Boot自动配置去执行`CONFIG`命令。我们可以通过以下方式实现: 1. **禁用键空间事件通知**(推荐):这是最安全的方法,因为不需要修改Redis服务器的配置,也不会降低Redis的安全性。我们可以通过Spring Boot的配置属性或者自定义配置类来实现。 2. **修改Redis服务器配置**:如果我们可以控制Redis服务器配置,并且安全条件允许,可以重新启用`CONFIG`命令或者直接设置`notify-keyspace-events`参数。但这种方法在生产环境中通常不被推荐,尤其是云服务环境,因为启用`CONFIG`命令可能存在安全风险。 下面详细说明这两种方法: **方法一:在Spring Boot应用中禁用键空间事件通知(推荐)** 我们可以通过配置属性来禁用键空间事件通知。在`application.properties`(或`application.yml`)中添加: ```properties # 禁用键空间事件通知 spring.redis.lettuce.keyspace-notifications-enabled=false ``` 如果你使用的是Jedis客户端,可以尝试: ```properties spring.redis.jedis.pool.enabled=false # 如果使用Jedis连接池,可能需要调整其他配置,但主要配置是下面的 spring.redis.enable.keyspace.events=false # 注意:这个属性可能不直接存在,所以更推荐使用下面的自定义配置 ``` 但是,根据不同的Spring Boot版本,可能属性名称略有不同。如果上述属性不起作用,我们可以通过自定义配置类来禁用: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceConnectionFactory factory = new LettuceConnectionFactory(); // 禁用键空间事件通知 factory.setEnableKeyspaceNotifications(EnableKeyspaceEvents.OFF); return factory; } } ``` 注意:上面的自定义配置需要根据你实际使用的连接工厂(Lettuce或Jedis)来调整。由于现在Spring Boot默认使用Lettuce,所以这里以Lettuce为例。 另外,如果你使用的是Spring Boot 2.x以上,可能更推荐通过`LettuceClientConfiguration`来配置: ```java @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .disableKeyspaceNotifications() // 禁用键空间通知 .build(); RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("localhost", 6379); return new LettuceConnectionFactory(serverConfig, clientConfig); } ``` 如果你已经使用了`application.properties`中的配置来连接Redis,那么可以只覆盖客户端的配置: ```java @Bean public LettuceConnectionFactory redisConnectionFactory() { LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .disableKeyspaceNotifications() .build(); return new LettuceConnectionFactory(new RedisStandaloneConfiguration(), clientConfig); } ``` **方法二:修改Redis服务器配置(不推荐,尤其是生产环境)** 如果我们有权限修改Redis服务器配置,并且安全策略允许,可以执行以下步骤: 1. 打开Redis配置文件(redis.conf)。 2. 查找`rename-command`指令,如果`CONFIG`命令被重命名为一个随机字符串或者被禁用,我们可以将其恢复或者设置一个密码来保护。但是,云服务通常不允许修改这些安全配置。 3. 或者,我们可以直接设置`notify-keyspace-events`参数,这样Spring Boot就不需要再通过`CONFIG`命令来获取和设置这个参数了。在redis.conf中添加: ```conf notify-keyspace-events Ex ``` 这里的`Ex`表示启用过期事件的键空间通知(Spring Session通常需要这个)。具体值取决于你的需求,可以参考Redis文档。 4. 重启Redis服务。 但是,由于云服务通常不允许我们修改这些配置,所以方法一更加通用。 总结:推荐使用方法一,在Spring Boot应用中禁用键空间事件通知。这样可以避免修改Redis服务器配置,同时也能解决启动错误。 注意:禁用键空间事件通知可能会影响某些功能,比如使用Spring Session时依赖Redis的键过期事件来清除会话。如果我们需要这个功能,那么必须确保Redis服务器允许使用`CONFIG`命令,或者我们手动配置了`notify-keyspace-events`(方法二)。如果必须使用键空间事件,而云服务又禁用了`CONFIG`命令,我们可以联系云服务提供商,看是否提供其他方式设置`notify-keyspace-events`。 下面我们给出一个完整的配置类示例(使用Lettuce): ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import io.lettuce.core.ClientOptions; import io.lettuce.core.ReadFrom; import io.lettuce.core.ClientOptions.DisconnectedBehavior; @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { // 创建客户端配置 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .disableKeyspaceNotifications() // 禁用键空间通知 .build(); // 创建单机Redis配置 RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("your.redis.host", 6379); serverConfig.setPassword(RedisPassword.of("yourpassword")); // 创建连接工厂 return new LettuceConnectionFactory(serverConfig, clientConfig); } } ``` 或者,如果使用配置文件中的主机和端口,可以使用`@Value`注入,但更简单的方式是使用`application.properties`配置基本连接信息,然后在配置类中只覆盖客户端配置: ```java @Bean public LettuceConnectionFactory redisConnectionFactory(RedisProperties redisProperties) { LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .disableKeyspaceNotifications() .build(); RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(); serverConfig.setHostName(redisProperties.getHost()); serverConfig.setPort(redisProperties.getPort()); serverConfig.setPassword(RedisPassword.of(redisProperties.getPassword())); return new LettuceConnectionFactory(serverConfig, clientConfig); } ``` 但是,请注意这样可能会覆盖Spring Boot的自动配置,所以确保其他配置(如连接池)也正确设置。 最简便的方式还是使用属性配置: ```properties spring.redis.lettuce.keyspace-notifications-enabled=false ``` 这样就不需要编写配置类了。 因此,我们优先推荐在`application.properties`中设置属性。如果这样不起作用(可能是版本问题),再尝试自定义配置类。 验证:启动应用,不再报错`ERR unknown command 'CONFIG'`。 如果问题仍然存在,请检查是否使用了多个Redis连接工厂,或者是否有其他配置覆盖了上述设置。 注意:禁用键空间通知后,依赖该通知的功能将无法使用。请根据实际业务需求决定是否禁用。 最后,如果我们的应用确实需要键空间事件通知(比如使用Redis作为缓存并希望监听缓存过期事件),那么我们需要联系云服务提供商,询问如何设置`notify-keyspace-events`参数(可能他们提供了控制台设置,或者我们可以通过其他方式设置)。如果云服务商不允许,可能需要更换Redis服务提供商或自建Redis。 下面生成相关问题: </think>### 解决 Spring Boot 启动报错:`ERR unknown command 'CONFIG'` 的完整方案 该错误发生在 Spring Boot 尝试执行 Redis 的 `CONFIG GET` 命令时,通常是因为云服务商(如 AWS ElastiCache、阿里云 Redis)出于安全考虑禁用了高危命令[^1][^2]。以下是具体解决步骤: #### 方法一:禁用键空间通知(推荐) 在 `application.properties` 中添加配置: ```properties # 禁用键空间事件监听 spring.redis.lettuce.keyspace-notifications-enabled=false ``` **原理**: Spring Data Redis 启动时会自动调用 `CONFIG GET notify-keyspace-events` 配置键空间通知[^1]。此设置直接禁用该行为,避免触发 `CONFIG` 命令。 #### 方法二:自定义 Redis 配置类 创建配置类强制关闭通知: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceConnectionFactory factory = new LettuceConnectionFactory(); // 关键设置:禁用键空间通知 factory.setEnableKeyspaceNotifications(EnableKeyspaceEvents.OFF); return factory; } } ``` **效果**: 直接阻止 Spring Boot 初始化时执行 `CONFIG GET` 命令[^1]。 #### 方法三:Redis 服务器端配置(需权限) 如果有 Redis 控制权,可修改 `redis.conf`: ```conf # 启用 CONFIG 命令(仅在内网安全环境使用) rename-command CONFIG "" # 或直接设置键空间事件参数 notify-keyspace-events Ex ``` **风险提示**: 云环境通常禁止此操作,可能违反安全策略[^2]。 #### 验证解决效果 成功启动后日志中 **不再出现** 以下错误: ``` RedisConnectionFailureException: ERR unknown command 'CONFIG' with args beginning with: GET notify-keyspace-events ``` #### 注意事项 1. **功能影响**:禁用键空间通知会导致依赖 Redis 过期事件的功能失效(如 Spring Session 自动清理)[^1] 2. **客户端选择**:Lettuce 和 Jedis 均可能触发此问题,解决方案通用 3. **云环境建议**:优先使用方法一或二,避免修改云服务商的安全配置 > 通过以上方案,可解决 99% 的 `CONFIG` 命令相关启动错误。如仍存在问题,需检查 Redis 连接配置是否正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值