面试官:Redis为什么默认16个数据库?

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:toutiao.com/
a6752317753866060299

  • 一、16个数据库的由来

  • 二、正确理解Redis的“数据库”概念

  • 三、集群情况下是否支持一个实例多个db?

  • 四、总结

面试官:Redis为什么默认16个数据库?_第1张图片


导读:在实际项目中Redis常被应用于做缓存,分布式锁、消息队列等。但是在搭建配置好Redis服务器后很多朋友应该会发现和有这样的疑问,为什么Redis默认建立了16个数据库,如下图所示。

面试官:Redis为什么默认16个数据库?_第2张图片

一、16个数据库的由来

Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与在一个关系数据库实例中可以创建多个数据库类似(如下图所示),所以可以将其中的每个字典都理解成一个独立的数据库。

面试官:Redis为什么默认16个数据库?_第3张图片 以MySQL实例为例

Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。

77fed07c07d26854739856055be79b1e.png

客户端与Redis建立连接后会默认选择0号数据库,不过可以随时使用SELECT命令更换数据库。

面试官:Redis为什么默认16个数据库?_第4张图片

在实际项目中则可以通过以Redis配置文件的形式指定数据库,如下图所示

面试官:Redis为什么默认16个数据库?_第5张图片

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

二、正确理解Redis的“数据库”概念

面试官:Redis为什么默认16个数据库?_第6张图片

由于Redis不支持自定义数据库的名字,所以每个数据库都以编号命名。开发者则需要自己记录存储的数据与数据库的对应关系。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么全部数据库都没有权限访问。但是,要正确地理解Redis的“数据库”概念这里不得不提到一个命令:

aeaf40b61480d679dd6b44abd153ef02.png

该命令可以清空实例下的所有数据库数据,这与我们所熟知的关系型数据库所不同。关系型数据库多个库常用于存储不同应用程序的数据 ,且没有方式可以同时清空实例下的所有库数据。所以对于Redis来说这些db更像是一种命名空间,且不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

三、集群情况下是否支持一个实例多个db?

面试官:Redis为什么默认16个数据库?_第7张图片

要注意以上所说的都是基于单体Redis的情况。而在集群的情况下不支持使用select命令来切换db,因为Redis集群模式下只有一个db0。再扩展一些集群与单机Reids的区别,感兴趣的朋友可以去查阅相关的资料深入理解,这里就不做讨论了。

  • key批量操作支持有限:例如mget、mset必须在一个slot

  • Key事务和Lua支持有限:操作的key必须在一个节点

  • key是数据分区的最小粒度:不支持bigkey分区

  • 不支持多个数据库:集群模式下只有一个db0

  • 复制只支持一层:不支持树形复制结构

面试官:Redis为什么默认16个数据库?_第8张图片

四、总结

Redis实例默认建立了16个db,由于不支持自主进行数据库命名所以以dbX的方式命名。默认数据库数量可以修改配置文件的database值来设定。对于db正确的理解应为“命名空间”,多个应用程序不应使用同一个Redis不同库,而应一个应用程序对应一个Redis实例,不同的数据库可用于存储不同环境的数据。最后要注意,Redis集群下只有db0,不支持多db。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

面试官:Redis为什么默认16个数据库?_第9张图片

已在知识星球更新源码解析如下:

面试官:Redis为什么默认16个数据库?_第10张图片

面试官:Redis为什么默认16个数据库?_第11张图片

面试官:Redis为什么默认16个数据库?_第12张图片

面试官:Redis为什么默认16个数据库?_第13张图片

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

你可能感兴趣的:(数据库,中间件,分布式,java,redis)