История изменений
Исправление witaway, (текущая версия) :
Если надумаете свой велосипед строить, можете позаимствовать подход Redis, у них это сделано примерно так:
-
Есть хеш-мапа с ключами-значениями и есть вторая хеш-мапа с ключами-TTLами
-
При каждом запросе данных он лениво удаляет истёкшие записи. Получили ключ, а оказалось, что ключ истёк — удалить данные и сказать, что там ничего не было.
-
Также постоянно крутится цикл, активно удаляющий истёкшие записи. На каждой итерации, N(=10) раз в секунду, берём M(=20) случайных записей и, если они истекли, то удаляем. Если было истечено больше K(=25)% ключей — повторить.
Начиная с Redis 6 ещё добавили оптимизацию:
- Если на предыдущем шаге были найдены записи, которые не истекли, но вроде бы скоро собираются, они добавляются в базисное дерево (radix tree) и на следующей итерации проверки начинаются сразу с этих записей.
Даже без последней оптимизации получается как-то элегантнее, чем тереть истёкшие записи по cron’у.
А если вам нужны только ключи и TTLы, без значений, можете вообще основную мапу из этой цепочки вырезать.
А лучше не изобретать велосипед и взять готовое решение. Не нравится лицензия — найдите альтернативу. Их, вроде бы, полно. 🤷♂️
Исходная версия witaway, :
Если надумаете свой велосипед строить, можете позаимствовать подход Redis, у них это сделано примерно так:
-
Есть хеш-мапа с ключами-значениями и есть вторая хеш-мапа с ключами-TTLами
-
При каждом запросе данных он лениво удаляет истёкшие записи. Получили ключ, а оказалось, что ключ истёк — удалить данные и сказать, что там ничего не было.
-
Также постоянно крутится цикл, активно удаляющий истёкшие записи. На каждой итерации, N(=10) раз в секунду, берём M(=20) случайных записей и, если они истекли, то удаляем. Если было истечено больше K(=25)% ключей — повторить.
Начиная с Redis 6 ещё добавили оптимизацию:
- Если на предыдущем шаге были найдены записи, которые не истекли, но вроде бы скоро собираются, они добавляются в базисное дерево (radix tree) и на следующей итерации проверки начинаются сразу с этих записей.
Даже без последней оптимизации получается как-то элегантнее, чем тереть истёкшие записи по cron’у. А если вам нужны только TTLы и ключи, без значений, можете вообще основную мапу из этой цепочки вырезать.
А лучше не изобретать велосипед и взять готовое решение. Не нравится лицензия — найдите альтернативу. Их, вроде бы, полно. 🤷♂️