玖叶教程网

前端编程开发入门

redis懒删除

redis是单线程

单线程给redis 带来了高效的性能和丰富的数据结构

1、基于内存操作

2、使用IO多路复用

3、单线程避免了cpu上下文切换

但是redis并不是完全单线程的,分为主线程和多个异步线程

比如redis 4.0 以后使用了unlink

redis 为什么要使用lazy free?

redis命令del 会直接释放内存,但是如果key占用的很大或者数量很多 比如hash list等那执行删除操作会造成redis卡顿(尤其是在redis 单线程高速使用中)

unlink 就是派上用场了

不会直接执行删除操作,而是推送给后台的异步线程去执行,释放内存。

那是不是使用unlink 就是都是异步执行?

不一定,unlink的源码中有个函数

delGenericCommand 其中一段代码告诉你同步执行还是异步执行

if (free_effort > LAZYFREE_THRESHOLD && val->refcount == 1) {

atomicIncr(lazyfree_objects,1);

bioCreateBackgroundJob(BIO_LAZY_FREE ,val,NULL,NULL);

dictSetVal(db->dict,de,NULL);

}

LAZYFREE_THRESHOLD初始化默认值是64

lazy free的执行步骤

1、清楚过期时间

2、调用dictUnlink将删除的对象从字典摘除

3、判断大小,小的直接删除,大的异步删除

主线程完成网络的key操作

还有bio 后台线程来处理刷盘等复杂的操作

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言