1 min read

为什么redis有多个数据库?

概述

Redis是一个开源内存数据库,在今天几乎每个服务端程序员都会或多或少的使用到。但是很少有人会注意到一个Redis实例并不是只有一个数据库。

设计

Redis实例使用redisServer结构体表示,结构体成员变量中的redisDb *db;是redisServer用来存储用户存入的键值。(默认有16个,通过配置文件中databases配置。每个客户端可以通过SELECT index命令选择要访问的数据库)

redisDb *db成员变量如下图最右边方框。

server

分析

数据分块优化查询速度?

将数据分块添加多级索引,但是找了很多地方发现每个db都是独立的,而且客户端对单个数据库操作时不会访问其他数据库,并且其他客户端无关操作例如RDB、AOF持久化操作也不会将各db关联起来。

并且redisdb中的dict本身就会在数据增多时对数据进行rehash,所以这个可能大概率不存在。

对数据进行分类?

redis本身是一个nosql数据库,想查询部分特征的数据本身操作会非常复杂,所以可能作者想用户可以根据需要将不同数据存入不同的db,但是db本身不支持自定义名称,只有编号,用户如果想将数据分类只能记住db的编号,每次访问数据时先用SELECT index命令切换数据库然后再操作。这个可能性很高,但也说服力不强。

因为实在没有想到其他的可能,所以我开始在网上找一下其他同行对此的见解,意外的搜到了作者一封邮件…

mail

原来作者最初的想法很多,但最后觉得很鸡肋,由于要保持向下兼容,所以就保留了这个功能。虽然实际生产中Redis实例很少会用到多个DB,但每个DB大概1m左右也不是十分耗费资源,所以无伤大雅。