Redis执行UNLINK命令删除Hash时,是否将其作为整体处理?
Redis
UNLINK 命令删除Hash结构的实际执行逻辑 Redis中的Hash结构示例:
ha -> { k1 -> v1 k2 -> v2 k3 -> v3 }
当执行unlink ha命令时(假设3个子键的值足够大,Redis会选择在单独线程中删除),实际的执行逻辑是怎样的?
我设想了两种可能:
- A. 先删除键
ha,之后在另一个线程中整体删除包含3个子键的整个值。 - B. 先删除键
ha以及子键k1、k2、k3,之后在另一个线程中逐个删除这3个子键对应的值。
实际执行逻辑更符合情况B,原因如下:
Redis的Hash结构底层依托哈希表(dict)实现,哈希表中存储的是各个子键值对的独立引用,而非一块连续的内存块。触发异步删除时,主线程会先将顶层键ha从全局键空间中移除,同时把包含所有子键的Hash哈希表加入异步任务队列。
在后台线程中,Redis会遍历Hash哈希表里的每一个子键值对,逐个释放每个值(v1、v2、v3)占用的内存,最后再释放Hash哈希表本身的结构内存。这和你提到的dict.c中的逻辑一致——因为每个子键的值都是独立的内存对象,必须逐个执行释放操作。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

