明明连接的是Redis的DB0,为什么能查到DB3的数据?
Redis Single开发过程中图简单省事Redis 一般会采用单机模式部署Spring Boot 应用连接 Redis 配置很简单spring: redis: database: 8 port: 6379 password: ****** timeout: 1000 host: 10.106.22.184如上配置连接的是 Redis 的DB8数据库。有些时候为了节省资源开发环境与测试环境会共用 Redis用不同的库进行隔离比如开发环境用DB8测试环境用DB9#测试环境 spring: redis: database: 9 port: 6379 password: ****** timeout: 1000 host: 10.106.22.184我们用同个应用用开发配置启动一个实例用测试配置也启动一个实例看彼此之间是否做到数据隔离了开发环境配置application-dev.ymlspring: redis: database: 8 port: 6379 password: ****** timeout: 1000 host: 10.106.22.184 server: port: 8081测试环境配置application-test.ymlspring: redis: database: 9 port: 6379 password: ****** timeout: 1000 host: 10.106.22.184 server: port: 8082新增两个接口一个往 Redis 的 List 中写数据一个从 Redis 的List 中读数据/** * author 青石路 */ RestController RequestMapping(db) public class DBController { private static final String LIST_KEY qsl:elem:list; Resource private RedisTemplateString, Object redisTemplate; GetMapping(add) public String listAdd(RequestParam(elem) String elem) { redisTemplate.opsForList().leftPush(LIST_KEY, elem); return elem; } GetMapping(rangeAll) public ListObject rangeAll() { return redisTemplate.opsForList().range(LIST_KEY, 0, -1); } }我们先调开发环境的add接口http://localhost:8081/db/add?elem123再调测试环境的rangeAll接口http://localhost:8082/db/rangeAll并未查询到开发环境的数据是不是开发环境数据写入 Redis 失败了呢我们再调下开发环境的rangeAll接口http://localhost:8081/db/rangeAll说明开发环境的 Redis 数据是写入成功的也说明Redis 的数据库之间是彼此隔离的其实我们验证的时候没必要这么麻烦直接通过 Redis 客户端连接 Redis 进行操作验证即可在DB8上添加的数据并不会在DB9查到Redis Cluster生产环境会追求 Redis 高性能的同时还会要求其高可用往往会采用集群模式部署。为了各个环境一致那么开发环境与测试环境的 Redis 也采用集群模式部署开发、测试、生产环境尽量保持一致因为环境不一致导致的问题排查起来真的很头疼但有时候服务器资源确实不充裕那么开发环境与测试环境往往会共用一套 Redis 集群用数据库隔离应用配置稍微调整下即可开发环境配置application-dev.ymlspring: redis: database: 8 password: hello-#redis timeout: 10000 cluster: nodes: 10.106.0.219:26379,10.106.0.220:26379,10.106.0.221:26379 server: port: 8081测试环境配置application-test.ymlspring: redis: database: 9 password: hello-#redis timeout: 10000 cluster: nodes: 10.106.0.219:26379,10.106.0.220:26379,10.106.0.221:26379 server: port: 8082是不是 so easy 我们先调测试环境的rangeAll接口http://localhost:8082/db/rangeAll此时测试环境是没有数据的我们再调开发环境的add接口http://localhost:8081/db/add?elemcluster123添加成功后我们再调测试环境的rangeAll接口对你们没看错查出数据了直接用 Redis 客户端看看我们选DB8会报错ERR SELECT is not allowed in cluster mode不只是DB8除了DB0之外的库都不能选莫非 Redis 集群模式只支持DB0 我们去翻一下官方说明cluster-spec里面有这么一段说明明确指出Redis 集群不像单机它不支持多数据库不允许使用 SELECT 命令也就是说集群模式下配置文件中的spring: redis: database: 9无效连接的始终是DB0库还隔离个毛的数据集群模式为什么只支持DB0跟 Redis 的设计理念有关Redis 设计上最求简单性和一致性集群模式下如果还支持多数据库你们觉得还会简单一致性还容易保证吗更细致的原因我们可以问问大模型以下是 DeepSeek 的回答