zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/15772969.html
Copyright © 2011-2022 走看看