Всегда ли команда 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.

Другие вопросы по тегам