前言
只有光头才能变强
今天继续来学习Redis,上一篇从零单排学Redis【青铜】已经将Redis常用的数据结构过了一遍了。如果还没看的同学可以先去看一遍再回来~
这篇主要讲的内容有:
- Redis服务器的数据库
 - Redis对过期键的处理
 - Redis持久化策略(RDB和AOF)
 
本文力求简单讲清每个知识点,希望大家看完能有所收获
一、Redis服务器中的数据库
我们应该都用过MySQL,MySQL我们可以在里边创建好几个库:
同样地,Redis服务器中也有数据库这么一个概念。如果不指定具体的数量,默认会有16个数据库。
上面的命令我们也可以发现:当切换到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中对每个数据库用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称为键空间。
键空间示意图:
Redis的数据库就是使用字典(哈希表)来作为底层实现的,对数据库的增删改查都是构建在字典(哈希表)的操作之上的。
例如:
 redis > GET message  "hello world" 1.2键的过期时间
Redis是基于内存,内存是比较昂贵的,容量肯定比不上硬盘的。就我们现在一台普通的机子,可能就8G内存,但硬盘随随便便都1T了。
因为我们的内存是有限的。所以我们会干掉不常用的数据,保留常用的数据。这就需要我们设置一下键的过期(生存)时间了。
- 设置键的生存时间可以通过
EXPIRE或者PEXPIRE命令。 - 设置键的过期时间可以通过
EXPIREAT或者PEXPIREAT命令。 
其实EXPIRE、
                        
                        
                    
