5分钟
Redis存储原理剖析<三>:key的惰性删除–异步删除策略
前面我们介绍了key在惰性删除时同步删除过程的实现,具体可见:
本篇文章,我们将继续探索惰性删除时,key的异步删除过程的实现。
6.1.2 异步删除
直接看异步删除的代码:
可以看到异步删除的过程中,添加异步任务的前置条件仍旧是引用计数,至于添加异步调度任务,核心代码在bioCreateBackgroundJob中,实际上就是调用了操作系统提供的标准库函数加锁,成功加锁后往类型为释放内存的任务队列中添加一个新的任务:
那么,既然调度任务进入队列,就一定会有出队的时候。bioCreateBackgroundJob所在的文件为bio.c,bio全称background io,作为redis的后台io线程,支撑着redis-server运行时所有的异步任务调度。bio.c中存在这样一个函数bioProcessBackgroundJobs,就是它从任务队列中拿出创建的调度任务并执行,这个函数在redis-server启动时就会被调用,redis-server启动的入口,就在server.c中的main函数:
不论是单机模式还是哨兵集群模式,都会调用InitServerLast进行server初始化:
到了bioProcessBackgroundJobs这一层,开始真正的任务调度过程:
在异步删除的代码中很明显看到只传入了一个arg1的值:
因此可以推断出在任务调度过程中会调用lazyfreeFreeObjectFromBioThread方法进行内存释放:
也是调用了decrRefCount,针对不同类型的value值,调用不同的释放内存函数。
所以不论是同步删除还是异步删除的方式,二者都是针对key所在的sds内存释放,和value不同类型的内存释放,底层最终都是会调用zfree进行内存释放,zfree封装了操作系统提供的free接口。
至此,惰性删除的流程,以及底层函数的调用已经分析完毕。