C # список, где элементы имеют TTL - PullRequest
8 голосов
/ 15 сентября 2011

Ради простого примера я хотел бы иметь список строк. Срок действия каждого элемента в списке должен истечь через 5 минут после добавления его в список. Хотя не может быть простого, встроенного способа сделать это, я хотел бы в конечном итоге получить структуру данных, API которой кажется, что она «просто работает».

Вы можете использовать его следующим образом:

var now = DateTime.now();
var list = new ListWithTTL<string>();
list.add("Bob", now);
list.add("Joe", now.AddMinutes(1));
list.add("Tom", now.AddMinutes(2));
list.add("Tim", now.AddMinutes(2));

Проверка элементов немедленно даст

["Bob", "Joe", "Tom", "Tim"]

Через несколько минут должно получиться

["Tom", "Tim"]

В конце концов список должен быть пустым.

Ответы [ 2 ]

24 голосов
/ 15 сентября 2011

Вы можете использовать класс MemoryCache в .NET 4, который позволяет указывать TTL при добавлении элемента.

Простой пример:

MemoryCache cache = new MemoryCache("foo");
cache.Add("bar", "baz", DateTime.Now.AddSeconds(5));
var bar = cache["bar"];//returns "baz"
Thread.Sleep(TimeSpan.FromSeconds(6));
var expired = cache["bar"]; //returns null

Несмотря на то, что вы не предоставляете вам список TTL напрямую, вы можете адаптировать его для своего решения, не нужно самостоятельно устанавливать срок действия кэша.

0 голосов
/ 15 сентября 2011

Вы должны быть в состоянии использовать SortedDictionary<DateTime, ...> и пользовательский IComparer<DateTime>, который "меняет" порядок словаря так, что самые старые элементы идут первыми. Перед возвратом элементов из словаря просто удалите первые N элементов, которые слишком старые.

Конечно, изменение коллекции "под прикрытием", когда вызывающая сторона ожидает простого чтения, может привести к проблемам в многопоточной среде, но это другая тема ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...