例如:在redis中,hash是:
ha -> {
k1 -> v1
k2 -> v2
k3 -> v3
}
当unlink ha
时,redis实际上是如何删除它的?
- (假设3个子键的值足够大,可以让redis决定在单独的线程中删除它们)。*
我可以想象的可能方式: - A.删除单个键
ha
,然后在另一个线程中删除整个值(包括3个子键)。 - B.删除键
ha
和子键k1
、k2
、k3
。然后删除3个值的子键?
那么到底是哪种情况,还是有更多种方式呢?
Redis相关源代码
https://github.com/redis/redis/blob/3ca451c46fed894bf49e7561fa0282d2583f1c06/src/dict.c#L553
根据上面的代码,似乎它更像是案例B。
这是有意义的,因为哈希表存储对值的引用,而不是在单个内存块中,因此需要逐个释放值,对吗?
1条答案
按热度按时间mqkwyuun1#
当你调用
unlink
来删除一个键(hash或其他结构)时,Redis会从数据库中删除它(键,子键和值),并将其放入一个待删除列表中。将有一个后台作业从另一个线程删除这些延迟删除的项。当Redis执行真实的的删除任务时,它会删除键的所有内容(键、子键和值)。