kb 30.05.2012 08:58 Gajim

Каким образом в key-value хранилищах реализовывают expire-дату у ячейки?

1. arts 30.05.2012 09:09

Самое очевидное решение — это пары время => список ключей.

2. gds 30.05.2012 09:17

я бы добавил эту дату в value, проверял бы при доступе и вдобавок периодически (зависит от объёма данных) запускал бы чистку. Схема хорошая, в реляционках использовал, но тут разнесение одного куска логики на два куска кода получается. Обычно приемлемо.

3. kbgds /2 30.05.2012 09:20 Gajim

ну фигня в том, что периодически придется проходиться по всему хранилищу. по ссылке http://programmers.stackexchange.com/que... предложил структуры данных, чтоб этого не делать :) но хз, может и проходиться тоже норм.

4. artskb /3 30.05.2012 09:23 Psi+

В моём варианте по всему хранилищу проходиться не надо — чистятся только те ключи, которые есть в списке.

5. gdskb /3 30.05.2012 09:23 umodni3508FAA6

а тут надо смотреть на конкретику. Конечно, в общем случае хуёво это, про всему хранилищу бегать. И более культурные решения тоже интересны.

6. kbgds /5 30.05.2012 09:26 Gajim

ну вот по ссылке я предложил структуру данных. интересно, можно ли лучше.

7. artskb /6 30.05.2012 09:27 Psi+

Вполне нормальное решение.

8. kbarts /7 30.05.2012 09:28 Gajim

яхз. интересно, как оно у редисов и прочих. http://stackoverflow.com/questions/86523...

9. utros 30.05.2012 16:30 pedobook

Я бы складывал в отдельное дерево:
ключ — время, когда этот объект нужно удалить
значение — указатель на объект, который мы хотим удалять
опционально, у удаляемого элемента можно сделать поле со ссылкой на соответствующий элемент этого дерева, чтобы можно было изменять TTL.
Периодически пробегаем дерево и удаляем из него элементы, у которых дата истечения меньше текущей

10. kbutros /9 30.05.2012 16:34 Gajim

ага, у меня тоже сначала был этот вариант. но у него сложность логарифмическая. а у варианта с бакетами (который по ссылке, что я постил, где я вопрос задавал есть), вариант с O(1).

11. utroskb /10 30.05.2012 16:42 pedobook

А вот изменение TTL у алгоритма с корзинками — O(n).
В принципе, в случае in-memory storage вроде Redis можно использовать AVL-дерево с указателем на минимальный элемент и тогда удаление элемента будет константным, а изменение TTL — логарифмическим.

12. utrosutros /11 30.05.2012 16:43 pedobook

А использование корзинок — очевидная оптимизация, применимая к любому алгоритму. Ну или почти к любому.

13. utrosutros /12 30.05.2012 16:50 pedobook

Хотя... Я гоню. Вариант с корзинками — самый оптимальный и при правильной реализации константа по всем операциям. Особенно если у нас нет требования о моментальном удалении элемента по истечении указанного промежутка времени и сильно ограничен максимальный TTL (количество корзинок).

Do you really want to delete ?