redis数据库
redis在初始化服务器时,会根据服务器状态的dbnum属性来决定创建多少个数据库,dbnum属性的值由服务器配置的database选项决定,默认情况下为16,redisServer结构如下:
struct redisServer {// ...//一个数组,保存着服务器中的所有数据库redisDb *db;int dbnum// ...
};
可以通过select命令选择切换到哪个数据库执行CRUD操作
redisDb
typedef struct redisDb {// ...//数据库键空间,保存着数据库中的所有键值对dict *dict;dict *expires// ...
} redisDb;
redisDb主要包含了dict 和 expires两个字典,dict字典用于存储键值对,expires字典用于存储设置了过期时间的key和其过期时间
过期删除策略
针对于redis过期删除问题,主要有三种策略:
(1)定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时来临时,立即执行键的删除操作。
这种方法会让redis给所有设置了过期时间的key都创建一个定时器,对CPU资源耗费极大
(2)惰性删除:放任键过期不管,每次获取键时,都检查下键是否过期,如果过期,删除该键
使用惰性删除时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们永远不会删除,无用的垃圾数据占用了大量的内存,而服务器不会去自己释放他们
(3)定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键
redis的过期删除策略
redis服务器实际使用的是惰性删除和定期删除两种策略