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

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

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

1

16个数据库的由来

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

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

以MySQL实例为例

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

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

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

<span style="font-size: 12px; font-family: CourierNewPS-ItalicMT;"><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 6px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;">#</span>切库<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 39px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;"><br mpa-from-tpl="t">redis></span>SELECT 1 <span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 149px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;"># 默认0号db,切换为1号db</span><br mpa-from-tpl="t">OK<br mpa-from-tpl="t">redis [1] > GET username # 从1号库中获取 username<br mpa-from-tpl="t">(nil)</span>
<span style="font-size: 12px; font-family: CourierNewPS-ItalicMT;"><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 6px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;">#</span>切库<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 39px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;"><br mpa-from-tpl="t">redis></span>SELECT 1 <span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #75715e; background: rgba(0, 0, 0, 0); display: inline; width: 149px; text-decoration: none solid #75715e; font-weight: 400; font-style: normal;"># 默认0号db,切换为1号db</span><br mpa-from-tpl="t">OK<br mpa-from-tpl="t">redis [1] > GET username # 从1号库中获取 username<br mpa-from-tpl="t">(nil)</span>
#切库
redis>
SELECT 1 # 默认0号db,切换为1号db
OK
redis [1] > GET username # 从1号库中获取 username
(nil)

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

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

2

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

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

<span style="font-size: 12px; font-family: CourierNewPS-ItalicMT;"># 清空一个<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">Redis</span>实例中所有数据库中的数据<br mpa-from-tpl="t"><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">redis</span>127<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 13px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.0</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 14px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.0</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 13px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.1</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #e6db74; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #e6db74; font-weight: 400; font-style: normal;">:6379</span>> <span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 53px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">FLUSHALL</span></span>
<span style="font-size: 12px; font-family: CourierNewPS-ItalicMT;"># 清空一个<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">Redis</span>实例中所有数据库中的数据<br mpa-from-tpl="t"><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">redis</span>127<span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 13px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.0</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 14px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.0</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #a6e22e; background: rgba(0, 0, 0, 0); display: inline; width: 13px; text-decoration: none solid #a6e22e; font-weight: 400; font-style: normal;">.1</span><span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #e6db74; background: rgba(0, 0, 0, 0); display: inline; width: 33px; text-decoration: none solid #e6db74; font-weight: 400; font-style: normal;">:6379</span>> <span style="font-family: CourierNewPS-ItalicMT; font-size: 12px; color: #f92672; background: rgba(0, 0, 0, 0); display: inline; width: 53px; text-decoration: none solid #f92672; font-weight: 400; font-style: normal;">FLUSHALL</span></span>
# 清空一个Redis实例中所有数据库中的数据
redis127.0.0.1:6379> FLUSHALL

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

3

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

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

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

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

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

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

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

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

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

 

4

总结

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

 

Aim for the moon. If you miss, you may hit a star.
把月亮作为你的目标。如果你没打中,也许你还能打中星星
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
No matter when you start, it is important not to stop after the start.
无论你在什么时候开始,重要的是开始之后就不要停止
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容