Redis 删除 key用 del 和 unlink 有啥区别?

问题

del 和 unlink 有啥区别啊?为什么String类型删除不会做异步删除?

彬彬回答

DEL 和 UNLINK 都是同步的释放 key 对象,区别是怎么释放后面的 value 对象

DEL 每次都是同步释放 value 部分,如果 value 很大,例如一个 list 里很多元素,这会阻塞 Redis 工作线程。

为了规避这个问题,4.0 里引出了 UNLINK 命令,可以异步释放 value 对象,放到一个子线程中。

这边需要引出一个释放的阈值,见后面解释。

目前默认的阈值是 64,例如只有一个 list 里面含有超过 64 个元素,才会异步释放,否则也是会同步释放 不同的数据结构的计算阈值的方式不一样,不过大致遵循一个原则:就是要释放多少块内存 即在小对象上使用 UNLINK 效果等同于 DEL,也是同步释放,区别就是要多走几个函数调用,例如判断 list 里需要判断列表的长度等

大 value 对象的释放是异步的,放在一个子线程上,小对象之所以不异步释放,是因为异步释放,主线程和子线程 之间需要做一些同步操作(这是有代价的),然后小对象释放,本身也很快就也不值得进行异步释放,内存释放也更及时。

即可能异步释放,实际上会比同步释放更慢,所以作者设置了个 64 的经验值

所以如果是一个小对象,DEL 和 UNLINK 其实一样;如果是一个大对象,UNLINK 会更加好。

所以大部分情况下都可以用 UNLINK 代替 DEL,而 Redis 其实也有个配置项,可以控制将 DEL 默认转换为 UNLINK(实现上都是同一个函数,只是入口 async 参数不同) 不过我们需要知道异步释放的好处(不阻塞主线程)和它的坏处(需要进行一些线程同步相关的操作,内存释放不及时)。

至于说 string 为啥不异步释放,主要是作者认为它是一整块内存空间,计算阈值的时候 string 的结果固定是 1,那么就 <= 64,就是同步释放。

在补充一点,前面举例是说的 list,底层是用的 quicklist,严格来说统计的是 quicklistNode 的节点数量,就不是列表元素数量。

像 zset 那些如果用的 ziplist/listpack 编码的话,这种计算出来的阈值是 1,就也不是元素数量。如果是跳表编码的话就是统计的元素数量。

然后至于选择的话,大部分情况可以无脑用 UNLINK,不过需要知道坏处。

例如对于每一次的 async delete,主线程给子线程提交任务时需要加锁解锁,bio 子线程消费任务的时候也要加锁解锁,要做一些线程同步,还有线程上下文切换,这些都是可能会有的潜在的问题,如果小元素都异步释放的话,的确代价可能会大,多线程做事情的确是会有这些麻烦。

可以多做压测来验证环境里到底哪个好,不过大部分情况这些我们不用关系,只要写代码的时候有意识的注意大 key 的释放就好。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15893.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来啦!OceanBase 第7期技术征文活动获奖名单公布!

“小鱼”的诞生与成长离不开广大开发者的陪伴与支持&#xff0c;我们非常兴奋能把 4.1 版本的这一系列新能力带给大家&#xff0c;“小鱼”会游得更快更远&#xff0c;也会陪伴更多数据库开发者一同成长。 OceanBase 联合墨天轮技术社区&#xff0c;举行「4.1 上手体验」第五届…

学习系统编程No.26【信号处理实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/26/13:35&#xff0c;昨天12点左右睡觉&#xff0c;本以为能和在学校一样&#xff0c;7点左右起床&#xff0c;设置了7点到8点30时间段内的4个闹钟&#xff0c;可惜没想到啊&#xff0c;没醒&#xff0c;直接睡到了12点&#xff…

【复习30-35题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十一天 21/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Paddle OCR 安装使用教程

文章目录 一、简介二、使用教程三、模型调用四、效果展示 一、简介 PaddleOCR是飞浆开源文字识别模型&#xff0c;最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别&#xff1b;支持倾斜、竖排等多种方向文字识别&#xff1b;支持GPU、CPU预测&#xff0c;并且…

阿里内部《Java工程师面试手册》火了,完整版 PDF 开放下载

前言 2023金九银十即将来临&#xff0c;很多同学会问Java面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考…

el-input输入框type=“number“时,禁止鼠标上下滑动改变数值

el-input输入框type"number"时&#xff0c;禁止鼠标上下滑动改变数值 解决方法&#xff1a;在el-input中添加属性设置 mousewheel.native.prevent

深度学习实例分割篇——Mask RCNN原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

Rust 第三天---内存管理与所有权

前面介绍了环境配置以及基础语法,掌握之后已经可以开始用Rust编写一些简单的程序了,今天就要来介绍一下Rust核心的功能—内存管理与所有权 1. 关于内存管理 无论什么高级语言必须考虑到的一点就是编写程序时对于内存的管理问题,更简单一点解释,利用编程语言能快速高效的分配内…

【零基础入门学习Python---Python中机器学习和人工智能之快速入门实践】

&#x1f680; 零基础入门学习Python&#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜…

GitHub Pages + Hexo

步骤 参考如下步骤&#xff1a;https://blog.csdn.net/yaorongke/article/details/119089190 出现的问题 1 Fluid主题 其更换Fluid主题时&#xff1a; 下载最新 release 版本 解压到 themes 目录&#xff0c;并将解压出的文件夹重命名为 fluid 按照上面执行后&#xff0c;后…

历史上的今天发生了什么事?华为日历带你“穿越”涨知识

探寻过去就会发现各种有趣的历史故事和知识值得细细品味&#xff0c;如果你想“穿越”过去&#xff0c;回顾历史上的今天曾经发生过的事件&#xff0c;或是以更轻松的方式增长历史知识&#xff0c;不妨试试订阅华为日历【历史上的今天】订阅服务。 无论是对历史一知半解的小白&…

基于PyQt5的桌面图像调试仿真平台开发(8)锐化

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…