C#: Как реализовать умный кэш

В целом я пытаюсь иметь только единственную точку выхода от функции. Существуют времена, однако, что выполнение поэтому на самом деле заканчивает тем, что создало тело более комплексной функции, чем необходимо, в этом случае лучше иметь несколько точек выхода. Это действительно должен быть "личный выбор" на основе получающейся сложности, но целью должно быть как можно меньше точек выхода, не жертвуя сложностью и понятностью.

19
задан Matthew Murdoch 9 December 2010 в 15:34
поделиться

4 ответа

Вы можете заключить каждый из ваших кэшированных элементов в WeakReference . Это позволило бы сборщику мусора возвращать элементы, если и когда это необходимо, однако это не дает вам детального контроля над тем, когда элементы исчезнут из кеша, или позволяет реализовать явные политики истечения срока действия и т. Д.

(Ха! Я только что заметил, что пример, приведенный на странице MSDN , представляет собой простой класс кэширования.)

18
ответ дан 30 November 2019 в 02:16
поделиться

Это хорошая дискуссия, но в зависимости от вашего приложения, вот несколько советов:

Вы должны определить максимальный размер кеша, что делать со старыми элементами, если ваш кеш заполнен , иметь стратегию очистки, определить время жизни объекта в кэше, может / должен ли ваш кеш храниться где-то еще в этой памяти, в случае аварийного завершения приложения, ...

3
ответ дан 30 November 2019 в 02:16
поделиться

Это большая проблема, вам необходимо определить область проблемы и применить правильные методы. Например, как бы вы описали истечение срока действия объектов? Они устаревают за фиксированный промежуток времени? Они устарели от внешнего события? Как часто это происходит? Кроме того, сколько у вас предметов? Наконец, сколько стоит сгенерировать объект?

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

следующий уровень может заключаться в ограничении количества объектов и использовании неявной политики истечения срока действия, такой как LRU (последний раз использовался). Для этого вы обычно используете двусвязный список в дополнение к вашему словарю, и каждый раз, когда к объекту обращаются, он перемещается в начало списка. Затем, если вам нужно добавить новый объект, но он превышает ваш предел общего количества объектов, вы должны удалить его из конца списка.

Затем вам может потребоваться принудительное явное истечение срока действия, либо в зависимости от времени, либо или какой-то внешний раздражитель. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

d обычно используют двусвязный список в дополнение к вашему словарю, и каждый раз, когда к объекту обращаются, он перемещается в начало списка. Затем, если вам нужно добавить новый объект, но он превышает ваш предел общего количества объектов, вы должны удалить его из конца списка.

Затем вам может потребоваться принудительное явное истечение срока действия, основанное на времени, или какой-то внешний раздражитель. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

d обычно используют двусвязный список в дополнение к вашему словарю, и каждый раз, когда к объекту обращаются, он перемещается в начало списка. Затем, если вам нужно добавить новый объект, но он превышает ваш предел общего количества объектов, вы должны удалить его из конца списка.

Затем вам может потребоваться принудительное явное истечение срока действия, либо в зависимости от времени, либо или какой-то внешний раздражитель. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

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

Затем вам может потребоваться принудительное явное истечение срока действия, либо в зависимости от времени, либо или какой-то внешний раздражитель. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

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

Затем вам может потребоваться принудительное явное истечение срока действия, либо в зависимости от времени, либо или какой-то внешний раздражитель. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

но если общее количество объектов превышает ваш предел, вы должны удалить его из конца списка.

Затем вам может потребоваться принудительное истечение срока действия, основанное либо на времени, либо на каком-либо внешнем стимуле. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

но если общее количество объектов превышает ваш предел, вы должны удалить его из конца списка.

Затем вам может потребоваться принудительное истечение срока действия, основанное либо на времени, либо на каком-либо внешнем стимуле. Это потребовало бы, чтобы у вас было какое-то событие истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

Это потребует от вас какого-то события истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

Это потребует от вас какого-то события истечения срока действия, которое можно было бы вызвать.

Как вы можете видеть, в кешировании много замысла, поэтому вам нужно правильно понимать свой домен и проектировать. Я чувствовал, что вы не предоставили мне достаточно подробностей, чтобы я мог обсуждать особенности.

PS Пожалуйста, подумайте об использовании Generics при определении вашего класса, чтобы можно было хранить многие типы объектов, что позволяет повторно использовать ваш код кэширования.

25
ответ дан 30 November 2019 в 02:16
поделиться

Это распространенная проблема, которая имеет множество решений в зависимости от потребностей вашего приложения. Это настолько распространено, что Microsoft выпустила целую библиотеку для решения этой проблемы. Вам следует проверить Microsoft Velocity, прежде чем развертывать собственный кеш. http://msdn.microsoft.com/en-us/data/cc655792.aspx Надеюсь на эту помощь.

3
ответ дан 30 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: