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

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进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- JVM缓存对象对GC的影响与优化方案
- 车载主动安全ADAS/DSM技术原理、业务应用与安心联平台接入方案
- 基于多模态视觉模型和图文向量模型的工业图像知识库研究与应用
- .NET 8 Web开发入门(四):注入燃料——Entity Framework Core 与 Code First 实战
- SolonCode v2026.5.13 发布:开启“数字员工”新时代
- 当 AI 开始写代码,谁来保证它不会翻车?
- Calico BGP Route Reflectors 路由反射器使用方式
- Oracle Deep Data Security (Deep Sec) 初体验
- 使用Cursor实现管理系统的主界面布局的Vue3前端开发
- 深入剖析Java内存模型与volatile关键字

