在实际项目中,Redis经常被用于缓存、分布式锁、消息队列等。但是在搭建配置Redis服务器之后,应该有很多朋友发现并有这样的疑问,为什么Redis默认会创建16个数据库,如下图所示。一、16个数据库的由来Redis是一个字典结构的存储服务器。Redis实例提供了多个字典来存储数据。客户端可以指定将数据存储在哪个字典中。这类似于在关系数据库实例中创建多个数据库(如下图所示),因此其中的每个字典都可以理解为一个独立的数据库。以MySQL实例为例,Redis默认支持16个数据库。您可以通过调整Redis配置文件redis/redis.conf中的数据库来修改该值。设置完成后重启Redis即可完成配置。客户端与Redis建立连接后,默认会选择0号数据库,但你可以随时使用SELECT命令更改数据库。#切库redis>SELECT1#默认0号库,切换到1号库OKredis[1]>GETusername#从1号库获取用户名(nil)。在实际项目中,可以通过Redis配置文件的形式来指定数据库,如下图2正确理解Redis的“数据库”概念由于Redis不支持自定义数据库名称,因此每个数据库都以数字命名。开发者需要记录存储的数据与数据库的对应关系。此外,Redis不支持为每个数据库设置不同的访问密码,因此一个客户端要么可以访问所有数据库,要么不能访问所有数据库。不过,要正确理解Redis的“数据库”概念,这里不得不提到一个命令:#清除一个Redis实例中所有数据库中的数据redis127.0.0.1:6379>FLUSHALL这条命令可以清除redis下的所有数据库数据instance,它不同于我们熟悉的关系型数据库。关系型数据库的多个库往往用于存储不同应用的数据,没有办法同时清除一个实例下的所有库数据。所以对于Redis来说,这些db更像是一个命名空间,并不适合存放不同应用的数据。比如你可以在一个应用的生产环境中使用0号数据库存储数据,在测试环境中使用1号数据库存储数据,但是在应用A中不宜使用0号数据库存储数据,1号数据库存储数据应用程序B中的数据。应用程序应该使用不同的Redis实例来存储数据。Redis非常轻量级。一个空的Redis实例只占用1M左右,不用担心多个Redis实例会额外占用大量内存。3.集群是否支持一个实例多个数据库?需要注意的是,以上是基于单台Redis的情况。在集群的情况下,不支持使用select命令切换db,因为Redis集群模式下只有一个db0。让我们展开一些集群和单机Reids的区别。有兴趣的朋友可以参考相关资料深入了解,这里不再赘述。Key批量操作支持受限:例如mget和mset必须在一个slot中Keytransaction和Lua支持受限:操作的key必须在一个node中key是数据分区的最小粒度:不支持bigkeypartitioning不支持多库:仅clustermodedb0replication只支持一层:不支持treereplicationstructure。4.总结Redis实例默认建立了16个dbs。由于不支持数据库独立命名,所以采用dbX的方式命名。默认的数据库个数可以通过修改配置文件的database值来设置。db的正确理解应该是“命名空间”。多个应用不应该使用同一个Redis库,一个应用应该对应一个Redis实例。可以使用不同的数据库来存储不同环境中的数据。最后需要注意的是Redis集群下只有db0,不支持多个db。
