首页 > 基础资料 博客日记
明明连接的是Redis的DB0,为什么能查到DB3的数据?
2026-04-17 09:30:01基础资料围观1次
开心一刻
有一天,小蚂蚁迷路找不到蚁窝,非常着急,恰好它的朋友从身边经过
它向朋友问道:哥们儿,你...你都如何回蚁窝(回忆我)?
朋友一愣,反问道:带...带...带着笑或是很沉默?

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.yml
spring:
redis:
database: 8
port: 6379
password: ******
timeout: 1000
host: 10.106.22.184
server:
port: 8081
测试环境配置:application-test.yml
spring:
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 RedisTemplate<String, Object> redisTemplate;
@GetMapping("add")
public String listAdd(@RequestParam("elem") String elem) {
redisTemplate.opsForList().leftPush(LIST_KEY, elem);
return elem;
}
@GetMapping("rangeAll")
public List<Object> rangeAll() {
return redisTemplate.opsForList().range(LIST_KEY, 0, -1);
}
}
我们先调开发环境的 add 接口

再调测试环境的 rangeAll 接口

并未查询到开发环境的数据,是不是开发环境数据写入 Redis 失败了呢?我们再调下开发环境的 rangeAll 接口

说明开发环境的 Redis 数据是写入成功的,也说明
Redis 的数据库之间是彼此隔离的
其实我们验证的时候没必要这么麻烦,直接通过 Redis 客户端连接 Redis 进行操作验证即可

在 DB8 上添加的数据,并不会在 DB9 查到

Redis Cluster
生产环境会追求 Redis 高性能的同时,还会要求其高可用,往往会采用集群模式部署。为了各个环境一致,那么开发环境与测试环境的 Redis 也采用集群模式部署
开发、测试、生产,环境尽量保持一致,因为环境不一致导致的问题,排查起来真的很头疼!!!
但有时候,服务器资源确实不充裕,那么开发环境与测试环境往往会共用一套 Redis 集群,用数据库隔离;应用配置稍微调整下即可
开发环境配置:application-dev.yml
spring:
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.yml
spring:
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 接口

此时,测试环境是没有数据的,我们再调开发环境的 add 接口

添加成功后,我们再调测试环境的 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 的回答

总结
-
Redis Single 模式支持多数据库,库与库之间可以数据隔离
-
Redic Cluster 模式不支持多数据库,只支持
DB0集群模式下要隔离环境的话,部署多个集群,一个集群对应一个环境
-
Redis集群只支持 DB0,是其分布式架构中一个深思熟虑的权衡,是一个通过简化核心模型来换取系统整体性能、稳定性和可扩展性的关键设计原则
为了满足多数据库,大大提升系统复杂度、降低系统性能和稳定性,太得不偿失了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差
- 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里实现可靠Flash IAP的方法
- Atcoder - abc453_d Go Straight
- Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量
- AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布
- 在后台服务中使用 Scoped 服务,为什么总是报错?
- H200 安装驱动并使用sglang启动模型
- 玩转控件:封装个带图片的Label控件
- Oracle数据库SCN推进技术详解与实践指南
- [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型

