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

     
  • 相关阅读:
    系统的访问
    tomcat 和 数据库的连接
    实体类编写规则
    webmagic 爬虫
    docker安装官方Redis镜像并启用密码认证
    解决Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. 问题
    Springboot配置druid报错Failed to bind properties under 'spring.datasource' to javax.sql.DataSource
    阿里云centos7.6搭建SVN远程仓库和Git远程仓库
    java 三大特性封装继承多态
    使用easyui tab需要注意的问题
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/15772969.html
Copyright © 2011-2022 走看看