数据库
首页 > 数据库> > Redis之懒惰删除

Redis之懒惰删除

作者:互联网

【懒惰删除】
Redis内部利用单线程处理了绝大部分指令,但对于一些耗时的操作,还有几个异步线程在做支撑。对于大部分key来说,del指令非常快,但如果key的value是一个很大的对象,那么del就会造成卡顿,所以Redis4.0引入了unlink指令,可以对删除操作进行懒处理,即不立即进行删除操作,而是交给一个异步线程处理并回收内存。

当执行unlink指令后,主线程不会再访问这个key,交给异步线程处理。
【flush】
Redis中的flushdb和flushall指令是极其缓慢的动作,Redis4.0后,在这两个指令后增加async操作,整个key集合即交给后台线程慢慢处理。
【异步队列-LazyFree】
主线程将对象的引用从key结构中摘除后,会将这个key的内存回收操作包装成一个任务,塞进异步任务队列中,后台线程会从这个异步队列中取任务。任务队列被主线程和异步线程同时操作,所以必须保证这个队列的线程安全。
如果key所占用的内存很小,延后处理就没有必要了,此时Redis会直接回收。
【异步队列-AOF Sync】
Redis每1秒需要将AOF日志存到磁盘,确保尽量不丢消息,这个操作是比较耗时的,所以Redis也将这个操作移到异步线程来完成。执行AOF Sync操作的线程是一个独立的异步线程,和前面的LazyFree线程不一样,同样也有一个属于自己的任务队列,队列里只存放AOF Sync任务。
【更多的异步删除处理】
除了del指令和flush操作之外,Redis在key过期,LRU淘汰,rename指令过程也会实施回收内存。此外,还有一种特殊的flush操作,其发生于正在进行全量同步的从节点中,在接受完整的rdb文件后,也需要将当前的内存一次性清空,以加载整个rdb文件的内容到内存。
打开这些点需要额外进行设置:
slave-lazy-flush:从节点接收完rdb后的flush操作
lazyfree-lazy-eviction:内存达到maxmemory时进行淘汰
lazyfree-lazy-expire key:过期删除
lazyfree-lazy-server-del rename:指令删除destKey

 

标签:异步,懒惰,删除,队列,Redis,指令,线程,key
来源: https://www.cnblogs.com/bruceChan0018/p/15772969.html