Как redis истекает?

Как Redis реализует истечение срока действия ключей? Отсюда я узнал, что Redis хранит время истечения срока действия ключа, но как именно это реализовано?

Ответ 1

Короче говоря - для каждого объекта redis существует срок действия. Если вы не установите срок действия объекта, это время "никогда".

Теперь сам механизм истечения полулени. Ленивое истечение срока действия означает, что вы фактически не истекаете объекты, пока они не будут прочитаны. При чтении объекта мы проверяем его метку времени истечения, а если это раньше, мы ничего не возвращаем и удаляем объект, пока мы на нем. Но проблема в том, что если ключ никогда не трогается, он просто занимает память без причины.

Таким образом, Redis добавляет второй слой случайного активного истечения. Он просто читает случайные ключи все время, а при касании просроченного ключа он удаляется на основе ленивого механизма. Это не влияет на поведение expire, оно просто добавляет "сборку мусора" ключей с истекшим сроком действия.

Конечно, фактическая реализация сложнее, чем это, но это основная идея.

Вы можете прочитать больше об этом здесь: http://redis.io/commands/expire

А исходный код для активного цикла истечения можно найти здесь: https://github.com/antirez/redis/blob/a92921da135e38eedd89138e15fe9fd1ffdd9b48/src/expire.c#L98