Всегда ли команда UNLINK лучше команды DEL?
В Redis 4.0 появилась новая команда UNLINK для удаления ключей из памяти Redis.
Эта команда очень похожа на DEL: она удаляет указанные ключи. Как и DEL, ключ игнорируется, если он не существует. Однако команда выполняет реальное восстановление памяти в другом потоке, поэтому она не блокируется, в то время как DEL. Отсюда и название команды: команда просто отсоединяет ключи от пространства клавиш. Фактическое удаление произойдет позже асинхронно.
Таким образом, всегда можно (100% раз) использовать UNLINK вместо DEL, поскольку UNLINK неблокирует, в отличие от DEL, верно?
2 ответа
Прежде чем обсуждать, какая из них лучше, давайте посмотрим на разницу между этими командами. И то и другое DEL
а также UNLINK
освободить ключевую часть в режиме блокировки. И разница в том, как они освобождают часть стоимости.
DEL
всегда освобождает часть значения в режиме блокировки. Однако, если значение слишком велико, например, слишком много выделений для большого LIST
или же HASH
, он блокирует Redis на долгое время. Чтобы решить проблему, Redis реализует UNLINK
команда, то есть "неблокирующее" удаление.
По факту, UNLINK
НЕ всегда неблокируемый / асинхронный. Если значение мало, например, размер LIST
или же HASH
меньше чем 64
, значение будет немедленно освобождено. В этом случае, UNLINK
почти так же, как DEL
за исключением того, что это стоит на несколько больше вызовов функций, чем DEL
, Однако, если значение большое, Redis помещает значение в список, и значение будет освобождено другим потоком, то есть свободным от неблокирования. Таким образом, основной поток должен выполнить некоторую синхронизацию с фоновым потоком, что также является затратным.
В заключение, если значение мало, DEL
по крайней мере, так хорошо, как UNLINK
, Если значение очень большое, например LIST
с тысячами или миллионами предметов, UNLINK
намного лучше чем DEL
, Вы всегда можете смело заменить DEL
с UNLINK
, Однако, если вы обнаружите, что синхронизация потоков становится проблемой (многопоточность всегда является головной болью), вы можете вернуться к DEL
,
ДА. пожалуйста, прочитайте Lazy Redis, лучше Redis от antirez. Но причина не в том, что команда unlink является неблокирующей командой. Причина unlink умнее чем del.
UNLINK - это умная команда: она вычисляет стоимость освобождения объекта, и если она очень мала, она просто делает то, что должна делать DEL, и освобождает объект как можно скорее. В противном случае объект отправляется в фоновую очередь для обработки.
Кроме того, я думаю, что более быстрый способ заключается в том, что мы принимаем решение о повторном использовании: использование DEL для маленького ключа, использование UNLINK для огромного ключа, такого как большой список или набор. Мы можем уменьшить ненужный расчет Redis.