Skip to content
On this page

Redis 中的多数据库

一个 Redis 实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库中可以创建多个数据库类似,所有可以将其中的每个字典都理解成一个独立的数据库。

Redis 默认支持 16 个数据库,分别编号为 0、1、2、...14、15

  • Redis 不支持自定义数据库名字
  • 因为每个数据库都以编号命名,所有开发者必须要明确哪个数据库存放了哪些数据
  • 可以通过配置参数 databases 修改支持的数据库个数

每个数据库都是独立的,也就是说你在 0 号数据库中插入的数据在 1 号数据库是访问不到的。

客户端与 Redis 建立连接后自动选择 0 号数据库,我们可以使用 SELECT 命令来更换数据库。

Shell
127.0.0.1:6379> SET a 1
OK
127.0.0.1:6379> KEYS *
1) "a"
127.0.0.1:6379> SELECT 16
(error) ERR DB index is out of range
127.0.0.1:6379> SELECT 15
OK
127.0.0.1:6379[15]> SET b 2
OK
127.0.0.1:6379[15]> KEYS *
1) "b"
127.0.0.1:6379[15]> SELECT 0
OK
127.0.0.1:6379> KEYS *
1) "a"
127.0.0.1:6379>

# 将指定 key 移动到指定数据库
move key db
127.0.0.1:6379> SET a 1
OK
127.0.0.1:6379> KEYS *
1) "a"
127.0.0.1:6379> SELECT 16
(error) ERR DB index is out of range
127.0.0.1:6379> SELECT 15
OK
127.0.0.1:6379[15]> SET b 2
OK
127.0.0.1:6379[15]> KEYS *
1) "b"
127.0.0.1:6379[15]> SELECT 0
OK
127.0.0.1:6379> KEYS *
1) "a"
127.0.0.1:6379>

# 将指定 key 移动到指定数据库
move key db

当选择的数据库编号超过最大数据库编号时,默认编号的数据库

Redis 不支持为每个数据库设置不同的访问密码,所有一个客户端要么可以访问全部数据库,要么一个数据库也没有权限访问。

最重要的一点是多个数据库之间并不是完全隔离的,比如 FLUSHALL 命令可以清空一个 Redis 实例中所有数据库中的数据。

综上所述,这些数据库更像是一个命名空间,而不适宜存储不同应用程序的数据,比如不适宜使用 0 号数据库存储 A 应用数据而使用 1 号数据库存储 B 应用数据,这是非常不推荐的做法!!!

不同的应用应该使用不同的 Redis 实例存储数据。由于 Redis 非常轻量级,一个空的 Redis 占用的内存只有 1 MB 作用,所以不用担心多个 Redis 实例会额外占用很多内存的问题。

Released under the MIT License.