В одном внутреннем сервисе Redis стал кушать ну слишком много памяти. Даже виртуалку повесил по OOM-у.
Полез разбираться. Оказалось, что в одной базе лежит неприлично больше количество ключей - около 2 млн. Посмотрел, что в ней хранится - токены сессий для API. Хм, а у них в коде MAX_AGE стоит 180 дней всего.
Спускаюсь ниже по коду, там где для записи указывается TTL:
expire=int(datetime.utcnow().timestamp()) + SESSION_MAX_AGE
Ну вроде хорошо, берем текущий таймштамп и плюсуем 180 дней. Так и записываем.
Пошел в документацию библиотечки:
expire(key, timeout)
Set a timeout on key
Таймаут… не таймштамп.. получается что о_о
Каждая запись создавалась с TTL
1780743477 секунд, что чуть больше 56 лет…Фикс выкатил. А Claude тем временем помог сделать скриптик, который пробежит по всем записям в Redis с TTL > 1 года и удалит старые. Скрипт запустил в фоне, крутится неспеша, память освобождается, все довольны.
