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

    浏览量

    6483
  • Redis
    +关注

    关注

    0

    文章

    362

    浏览量

    10496

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

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

收藏 人收藏

    评论

    相关推荐

    Linux系统中unlink命令的使用

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

    不会做Android的蓝牙调试

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

    12864和彩屏区别,19264呢

    12864和彩屏区别,,19264呢
    发表于 05-07 14:55

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

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

    删除BlueNRG服务后没有释放内存

    似乎没有释放内存:在少量添加/删除之后,由于内存不足错误,我不能再添加服务了。我使用aci_gatt_del_char和aci_gatt_del_service函数来删除服务,但是还有
    发表于 03-11 16:28

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

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

    string类型数据与《string.h》头文件的区别在哪里?

    string的含义是什么?string与vector容器的区别在哪?c中的字符串是什么?string类型数据与《
    发表于 07-05 07:18

    string与《string.h》哪些区别

    string与《string.h》的定义何不同?string与《string.h》哪些
    发表于 10-09 07:22

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

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

    删除软件的方法有哪些?

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

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

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

    微软Windows版本2004将删除SwiftKey键盘

    微软似乎正考虑从Windows 10中删除SwiftKey键盘。目前已有多家外媒发现微软从Windows 10 20H1 2004版中删除了SwiftKey输入法,预计以后的系统版本中也将不会出现该输入法。
    的头像 发表于 01-07 11:03 2204次阅读

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

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

    linux中删除文件的命令

    -R 命令后面跟上目录名,可以删除整个目录及其下的所有文件。 rm -f 命令后面跟上文件名,可以强制删除文件,而不会询问用户是否删除。 rm -i 命令后面跟上文件名,会在
    的头像 发表于 11-08 14:11 338次阅读

    linux删除文件命令rm

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