Это зависит от вашей модели данных.Удачный ответ заключается в том, что из-за их предсказуемой природы вы можете построить свою модель данных для учета TTL.
Допустим, я строю следующую таблицу для отслеживания пользовательских запросов к службе REST,например.Предположим, что я действительно забочусь о данных за последнюю неделю, поэтому я установлю TTL 604800 секунд (7 дней).Таким образом, запрос, который мне нужно поддержать, в основном таков (запрос транзакций для пользователя 'Bob' за предыдущие 7 дней):
SELECT * FROM rest_transactions_by_user
WHERE username='Bob' AND transaction_time > '2018-05-28 13:41';
Для поддержки этого запроса я создам следующую таблицу:
CREATE TABLE rest_transactions_by_user (
username TEXT,
transaction_time TIMESTAMP,
service_name TEXT,
HTTP_result BIGINT,
PRIMARY KEY (username,transaction_time))
WITH CLUSTERING ORDER BY (transaction_time DESC)
AND gc_grace_seconds = 864000
AND default_time_to_live = 604800;
Несколько замечаний:
- Я оставляю
gc_grace_seconds
по умолчанию 864000 (десять дней).Это гарантирует, что надгробия TTL будут иметь достаточное время для распространения по всему кластеру. - Ряды будут TTL через 7 дней (как упомянуто выше).После этого они становятся надгробными камнями еще на 10 дней.
- Я кластеризируюсь по
transaction_time
в порядке убывания.Это помещает строки, которые меня интересуют (те, которые не имеют TTL'd) в «верх» моего раздела (последовательно). - Запрашивая
transaction_time
из предыдущих 7 дней, яЯ игнорирую все, что старше, чем это.Поскольку мои надгробия TTL будут существовать в течение 10 дней после этого, они будут находиться в «нижней части» моего раздела.
Таким образом, ограничение моего запроса последними 7 днями гарантирует, что Cassandra никогда не придется иметь дело с надгробиями , так как мой запрос никогда не найдет их .Так что в этом случае я построил модель данных, в которой TTL "лучше", чем случайное удаление.