0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

小林coding 来源:小林coding 2023-04-17 10:10 次阅读

问题

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

彬彬回答

b0ff4b80-dc1c-11ed-bfe3-dac502259ad0.jpg

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 的释放就好。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Del
    Del
    +关注

    关注

    0

    文章

    3

    浏览量

    6490
  • Redis
    +关注

    关注

    0

    文章

    370

    浏览量

    10825

原文标题:Redis 删除 key用 del 和 unlink 有啥区别?

文章出处:【微信号:小林coding,微信公众号:小林coding】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux系统中unlink命令的使用

    在 Linux 中删除文件,我们通常使用 rm 命令。除此以外,还有另外一个命令,可以用于删除文件和链接,这就是 unlink 命令。虽然它听起来像是只能删除 Linux 系统中的链接
    发表于 09-13 14:29 2030次阅读

    不会做Android的蓝牙调试

    不会做Android的蓝牙调试
    发表于 12-17 22:35

    请问如何用f_unlink删除一个文件夹?

    不知道怎么删除掉这个文件夹查了一下,用f_unlink函数是没错的但是试过以下的都不行:f_unlink("0:/PHOTO1");f_unlink("/PHOTO1");f_
    发表于 12-03 08:38

    为什么YouTask自己删除自己不会显示多次?

    这个程序是从mytask里面删除youtask,想请问一下大神,在youtask执行完:if( OSTaskDelReq(OS_PRIO_SELF ) == OS_TASK_DEL
    发表于 08-15 02:13

    如何删除网卡驱动(彻底删除)

    如何删除网卡驱动 删除旧网卡信息 网卡换了个插槽,进入系统时,设备管理器中就多出了个网卡Realtek RTL8139 Family PCI Fast Et
    发表于 12-05 16:40 4.1w次阅读

    删除软件的方法哪些?

    删除软件的方法哪些? 1、直接删除发  绿色软件(不用安装就能够直接使用的软件),不会对系统配置进行任何修改,对于这样的
    发表于 02-23 15:24 1130次阅读

    如何彻底删除“我的文档”

    如何彻底删除“我的文档”    在windows XP中,当我们删除“我的文档”中的“我的音乐”、“图片收藏”等文件夹后,重新启
    发表于 02-24 11:50 1133次阅读

    重要机密文档该删除还是粉碎?

      重要机密文档,彻底删除就绝对安全了吗?我们安装瑞星杀毒软件后,通常会在鼠标右键中出现一个“文件粉碎”的选项,它跟我们平常的文件删除什么区别呢?怎
    发表于 07-12 17:03 3277次阅读
    重要机密文档该<b class='flag-5'>删除</b>还是粉碎?

    linux如何复原已经删除的文件

    Linux不像windows那么显眼的回收站,不是简单的还原就可以了。linux删除文件还原可以分为两种情况,一种是删除以后在进程存在删除信息,一种是
    的头像 发表于 09-07 10:38 2883次阅读

    拼多多被曝远程删除用户照片

    对于近日个别拼多多用户反馈“vivo”手机提示拼多多App删除照片的问题,拼多多官方在今晚回应称,只是删除缓存,拼多多绝不会删除用户主动保存的任何照片和文件。
    的头像 发表于 01-13 11:02 2602次阅读

    删除网络失败的问题处理

    实例化终止时,网元侧经常报删除网络失败“delete_network_precommit failed”,在Provider界面检查网络的子网和端口,检查结果为都已经清除,但是手工删除网络同样报错,如下图所示。
    的头像 发表于 09-20 11:05 843次阅读
    <b class='flag-5'>删除</b>网络失败的问题处理

    Redis的删除策略和内存淘汰机制介绍

    Redis过期键的删除策略? Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用。 惰性删除:Redis的惰性
    的头像 发表于 10-09 11:06 453次阅读

    linux中删除文件的命令

    在Linux中,可以使用 rm 命令来删除文件。该命令多个参数和选项可供使用,以根据不同的情况进行文件删除操作。例如: rm 命令后面跟上文件名,可以删除单个文件。 rm -r 或
    的头像 发表于 11-08 14:11 757次阅读

    linux删除文件命令rm

    在Linux系统中,可以使用rm命令来删除文件或目录。该命令的功能是删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,rm命令只是断开了链接,源文件
    的头像 发表于 11-13 16:42 820次阅读

    bigdecimal转string类型

    将BigDecimal转换为String类型是在Java编程中常常遇到的一个问题。BigDecimal是Java中用于表示高精度十进制数的类,而String则是用于表示文本字符串的数据类型
    的头像 发表于 11-30 11:09 6141次阅读