redisDb底层结构

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服务器实际使用的是惰性删除和定期删除两种策略

你可能感兴趣的:(redis)