Redis后台线程之非阻塞删除

server/2024/10/22 17:30:28/

在这里插入图片描述

当Redis执行删除命令的时候,如果被删除的对象是列表、集合、散列类型,因为这些数据类型包含的元素存放在不同的内存块中,redis需要遍历所有元素来释放其对应的内存块空间,这个耗时操作可能导致redis阻塞,redis4提供的UNLINK命令可以实现非阻塞删除(Redis4引入了后台线程)。

UNLINK删除命令流程:
  1. 首先检查过期字典中是否包含该健,有则先从过期字典中删除
  2. 将该健在从过期字典中删除的返回键值对,这时并没有删除键值对对象
  3. 计算该键值对的值对象占用的字节数
  4. 若该值对象的字节数大于LAZYFREE_THRESHOLD(64字节),且该值对象只被当前一处引用则执行如下操作,实现非阻塞删除:
    1. 创建一个后台任务负责删除值对象(后台线程处理)
    2. 将该键值对的值对象引用设置为NULL,保证主线程访问不到
  5. 删除值对象,并释放其内存空间

非阻塞删除的场景下,后台线程负责删除值对象,主进程负责处理用户请求,后台线程后续删除值对象时并不需要进行线程同步操作(引用为null,主进程访问不到)。

后台线程的实现
  1. Redis有3类后台任务:文件关闭、磁盘同步和非阻塞删除:
    1. 磁盘同步策略若是每秒执行一次,则是后台线程负责
    2. AOF重写时,会用后台线程关闭临时文件
  2. 设置线程栈大小(避免有些线程栈太小无法处理任务)
  3. 创建后台线程,指定该线程负责的任务类型
    1. 线程创建以后抢占该任务的互斥量,再将该任务添加到对应的任务队列中
      1. 首先抢占该任务类型的互斥量
      2. 检查任务队列待处理任务是否为空,若为空,则阻塞当前线程
      3. 若队列中存在待处理的任务,获取一个任务,并释放互斥量
      4. 根据任务类型执行对应的处理逻辑,执行任务
      5. 重新抢占互斥量,并删除任务
    2. 处理任务,最后释放互斥量

http://www.ppmy.cn/server/104664.html

相关文章

钡铼技术BL196模块化远程IO模块数字输入输出

钡铼技术的BL196模块化远程IO模块是一款专为工业自动化设计的高度灵活的解决方案。特别地,BL196模块支持数字输入/输出功能,这使得它能够在各种工业环境中发挥重要作用。 产品概述 BL196模块化远程IO模块是一种高度灵活的远程IO系统,它支持…

【前端基础篇】CSS基础速通万字介绍(下篇)

文章目录 前言背景属性背景颜色背景图片背景平铺背景位置背景尺寸 圆角矩形生成圆形生成圆角矩形 Chrome调试工具打开方式标签页含义elements标签页使用 元素显示模式块级元素行内元素/内联元素行内元素和块级元素的区别 盒模型边框内边距外边距 块级元素水平居中去除浏览器默认…

Ignition Gateway配置

Config-System backup和restore: backup可以直接备份整个gateway配置,包括所有项目。 restore可以恢复gateway配置,包括所有项目。

node版本管理工具Node Version Manager(nvm)的安装及使用

文章目录 一、nvm安装1.1,下载nvm安装包程序(选最高版本安装即可,安装前先把本机电脑node卸载,不然管理不到)双击安装包进行安装(傻瓜式下一步即可) 二、配置镜像2.1、使用管理员运行命令提示符2.2、检查nv…

嵌入式和单片机有什么区别?

目录 (1)什么是嵌入式? (2)什么是单片机? (3)嵌入式和单片机的共同点 (4)嵌入式和单片机的区别 (1)什么是嵌入式? 关…

【STM32】C语言基础补充

学习过程中发现自己好些需要用到的C语言语法、特征都不太熟练了,特意记录一下,免得忘记了,以后遇到了新的也会继续更新 目录 1 全局变量 2 结构体 3 静态变量 4 memset()函数 5 使用8位的存储器存16位的数 1 全局变量…

每天五分钟深度学习框架pytorch:自动求导机制

本文重点 深度学习框架pytorch拥有自动求导的机制,自动求导是 PyTorch 中非常重要的特性,能够让我们避免手动去计算非常复杂的导数,这能够极大地减少了我们构建模型的时间。本文学习的是第10步反向传播,学习路线参考前面一篇文章。 pytorch0.4版本 在pytorch的0.4版本中…