这篇主要讲的内容有:
Redis服务器的数据库
Redis对过期键的处理
Redis持久化策略(RDB和AOF)
本文力求简单讲清每个知识点,希望大家看完能有所收获
一、Redis服务器中的数据库
我们应该都用过MySQL,MySQL我们可以在里边创建好几个库:
MySQL创建几个数据库
同样地,Redis服务器中也有数据库这么一个概念。如果不指定具体的数量,默认会有16个数据库。
通过SELECT命令可以切换到0~15的数据库
上面的命令我们也可以发现:当切换到15号数据库,存进15号库的数据,再切换到0号数据库时,是获取不到的!
这说明,数据库与数据库之间的数据是隔离的。
1.1Redis数据库的原理
Redis服务器用redisServer结构体来表示,其中redisDb是一个数组,用来保存所有的数据库,dbnum代表数据库的数量(这个可以配置,默认是16)
struct redisServer{ //redisDb数组,表示服务器中所有的数据库 redisDb *db; //服务器中数据库的数量 int dbnum; };
我们知道Redis是C/S结构,Redis客户端通过redisClient结构体来表示:
typedef struct redisClient{ //客户端当前所选数据库 redisDb *db; }redisClient;
Redis客户端连接Redis服务端时的示例图:
Redis客户端连接Redis服务端时的示例图
Redis中对每个数据库用redisDb结构体来表示:
typedef struct redisDb { int id; // 数据库ID标识 dict *dict; // 键空间,存放着所有的键值对 dict *expires; // 过期哈希表,保存着键的过期时间 dict *watched_keys; // 被watch命令监控的key和相应client long long avg_ttl; // 数据库内所有键的平均TTL(生存时间) } redisDb;
从代码上我们可以发现最重要的应该是dict *dict
,它用来存放着所有的键值对。对于dict
数据结构(哈希表)我们在上一篇也已经详细说了。一般我们将存储所有键值对的dict
称为键空间。
键空间示意图:
作者:Java3y
链接:https://www.jianshu.com/p/b5b2b04cb43f