93.7% 的程序员!竟然都不知道 Redis 为什么默认 16 个数据库?

▍导读

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

椐调查发现:93.7% 的程序员!竟然都不知道 Redis 为什么默认 16 个数据库?

一、16 个数据库的由来

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

以 MySQL 实例为例

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

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

切库

redis> SELECT 1 # 默认 0 号 db,切换为 1 号 db
OK
redis 1 > GET username # 从 1 号库中获取 username
(nil)
在实际项目中则可以通过以 Redis 配置文件的形式指定数据库,如下图所示

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

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

清空一个 Redis 实例中所有数据库中的数据

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

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

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

key 批量操作支持有限:例如 mget、mset 必须在一个 slot
Key 事务和 Lua 支持有限:操作的 key 必须在一个节点
key 是数据分区的最小粒度:不支持 bigkey 分区
不支持多个数据库:集群模式下只有一个 db0
复制只支持一层:不支持树形复制结构
四、总结

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

(免责声明:本网站(https://c.shenzhoubb.com)
内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。)

转载