redis关于数据结构的定义:
typedef struct redisDb {
dict *dict;//存储key-value键值对
dict *expires;//存储每个key的失效时间
dict *blocking_keys;
dict *ready_keys;
dict *watched_keys;
int id;
} redisDb;
1.消极方法:
就是在读取键值的时候,判断时间是否失效;
2.积极方案:
为了能够更好的回收内存空间,也需要有积极的回收方案;积极方案就是通过redis的时间事件有计划的进行失效主键的删除,时间事件的回调函数是serverCron,它在redis启动时创建,每秒的启动时间由REDIS_DEFAULT_HZ定义;默认每秒10次;serverCron其实还兼任其他任务,客户端链接超时/aof的触发等等;
为了不让删除主键占用过多的cpu资源,每次删除失效主键的时间事件并不是删除所有的库及所有的键值;
Redis 服务器中每个数据库的 expires 字典表中,从中尝试着随机抽样 REDIS_EXPIRELOOKUPS_PER_CRON(默认值为10)个设置了失效时间的主键,检查它们是否已经失效并删除掉失效的主键,如果失效的主键个数占本次抽样个数的比例超过25%,Redis 会认为当前数据库中的失效主键依然很多,所以它会继续进行下一轮的随机抽样和删除,直到刚才的比例低于25%才停止对当前数据库的处理,转向下一个数据库。这里我们需要注意的是,activeExpireCycle 函数不会试图一次性处理Redis中的所有数据库,而是最多只处理 REDIS_DBCRON_DBS_PER_CALL(默认值为16),此外 activeExpireCycle 函数还有处理时间上的限制,不是想执行多久就执行多久,凡此种种都只有一个目的,那就是避免失效主键删除占用过多的CPU资源