懒惰删除和redis中的特殊线程
懒惰删除
删除key的指令是del,如果key非常大,这个指令就会卡顿,此时可以用unlink,它会将删除丢给后台进程异步回收内存,在执行的一瞬间,其他客户端就无法访问到该key了。(如果key很小就会立刻删除)
删除任务会塞进异步任务队列(主线程操作这个队列时会有加锁和解锁操作,如果异步线程在休眠的话还会唤醒),后台线程会依次处理这些任务。
异步清空数据库
flushdb和flushall命令用来清空数据库,但是也很耗时,可以用async来代替异步删除。
AOF刷磁盘
在进行AOF时,将内存中的数据刷新到磁盘的sync函数也是很耗时的,会导致主线程效率下降,所以redis也会使用一个异步线程来操作这个过程,它也有一个属于自己的任务队列。
其他异步操作
还有很多的删除:淘汰时、过期时、rename时这些都可以通过配置来异步完成。
异步删除方案在最初设计时并没有考虑到,是后来才改造的,因为redis的对象共享机制,导致懒惰删除不干净,为了支持懒惰删除,redis将这种机制抛弃,改用了无共享设计。
其他异步操作:主从同步的增量同步