Myślałem o tym, w jaki sposób obecne magazyny klucz-wartość wdrażają „datę ważności” artykułów. Obecnie mam na myśli 2 warianty:
- nic nie robią (przechowują wygasłe dane) i sprawdzają tylko wtedy, gdy robisz, na przykład GET przez jakiś klucz. Problem polega na tym, że jeśli masz ograniczoną pamięć, wygasłe elementy nie zostaną usunięte.
przechowują dodatkowe struktury danych, aby „najwcześniej wygasły”. Widzę, że można to zrobić za pomocą czegoś takiego:
storage_data = dict(key -> [value, expire_timestamp]) expire_tree = SomeBinaryLikeTree(expire_timestamp -> [keys])
źródło
Zakładam, że pamięć klucz-wartość jest zbyt duża, aby iterować po wszystkich parach kv, aby dowiedzieć się, które mogą wygasnąć. Zakładam również, że każdy dostęp do odczytu odświeża znacznik czasu wygaśnięcia, dlatego wygasają tylko te elementy, które nie były dostępne przez pewien czas.
Wyzwanie polega na wydajnym znalezieniu wszystkich rekordów, które mogą wygasnąć (za każdym razem, gdy konieczne jest czyszczenie), ale także efektywnym odświeżeniu znacznika czasu wygaśnięcia przy każdym dostępie do odczytu (więc musimy znaleźć klucz w strukturze używanej do wygaśnięcia).
Moja propozycja: grupuj datownik_czasowy w znaczniki; na przykład, jeśli przedmioty żyją przez 8 godzin, zrób jedno wiadro na godzinę. Wiadra te są przechowywane na połączonej liście; gdy nastąpi utrata ważności, pierwsze wiadro jest opróżniane, a lista zmniejszana. Liczba segmentów to okres użytkowania / interwał czyszczenia. Każdy segment zawiera hashSet wszystkich kluczy, które powinny wygasnąć. Iteracja wszystkich kluczy w zestawie skrótów jest wystarczająco wydajna.
Podczas dostępu do odczytu program sprawdza, w którym segmencie znajduje się obecnie klucz i do którego segmentu należy teraz. W większości przypadków jest to to samo wiadro, więc nie są wymagane żadne dalsze działania. W przeciwnym razie wyjmij klucz ze starego wiadra (usuwanie z zestawu skrótów jest skuteczne) i włóż go do nowego wiadra.
źródło