LINUX.ORG.RU

История изменений

Исправление witaway, (текущая версия) :

Если надумаете свой велосипед строить, можете позаимствовать подход Redis, у них это сделано примерно так:

  1. Есть хеш-мапа с ключами-значениями и есть вторая хеш-мапа с ключами-TTLами

  2. При каждом запросе данных он лениво удаляет истёкшие записи. Получили ключ, а оказалось, что ключ истёк — удалить данные и сказать, что там ничего не было.

  3. Также постоянно крутится цикл, активно удаляющий истёкшие записи. На каждой итерации, N(=10) раз в секунду, берём M(=20) случайных записей и, если они истекли, то удаляем. Если было истечено больше K(=25)% ключей — повторить.

Начиная с Redis 6 ещё добавили оптимизацию:

  1. Если на предыдущем шаге были найдены записи, которые не истекли, но вроде бы скоро собираются, они добавляются в базисное дерево (radix tree) и на следующей итерации проверки начинаются сразу с этих записей.

Даже без последней оптимизации получается как-то элегантнее, чем тереть истёкшие записи по cron’у.

А если вам нужны только ключи и TTLы, без значений, можете вообще основную мапу из этой цепочки вырезать.

А лучше не изобретать велосипед и взять готовое решение. Не нравится лицензия — найдите альтернативу. Их, вроде бы, полно. 🤷‍♂️

Исходная версия witaway, :

Если надумаете свой велосипед строить, можете позаимствовать подход Redis, у них это сделано примерно так:

  1. Есть хеш-мапа с ключами-значениями и есть вторая хеш-мапа с ключами-TTLами

  2. При каждом запросе данных он лениво удаляет истёкшие записи. Получили ключ, а оказалось, что ключ истёк — удалить данные и сказать, что там ничего не было.

  3. Также постоянно крутится цикл, активно удаляющий истёкшие записи. На каждой итерации, N(=10) раз в секунду, берём M(=20) случайных записей и, если они истекли, то удаляем. Если было истечено больше K(=25)% ключей — повторить.

Начиная с Redis 6 ещё добавили оптимизацию:

  1. Если на предыдущем шаге были найдены записи, которые не истекли, но вроде бы скоро собираются, они добавляются в базисное дерево (radix tree) и на следующей итерации проверки начинаются сразу с этих записей.

Даже без последней оптимизации получается как-то элегантнее, чем тереть истёкшие записи по cron’у. А если вам нужны только TTLы и ключи, без значений, можете вообще основную мапу из этой цепочки вырезать.

А лучше не изобретать велосипед и взять готовое решение. Не нравится лицензия — найдите альтернативу. Их, вроде бы, полно. 🤷‍♂️