добавление в кэш асинхронно - PullRequest
0 голосов
/ 19 января 2011

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

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

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

  1. Проверить, находится ли в кеше, если нет, продолжить
  2. запустить асинхронный поток
  3. проверьте еще раз, если в кеше
  4. заблокируйте кеш
  5. проверьте еще раз, если в кеше
  6. добавьте в кэш

Ответы [ 2 ]

1 голос
/ 19 января 2011

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

Одним из недостатков асинхронного проекта является отсутствие возможности для вызывающего кода реагировать на любые проблемы, возникающие в результате попытки добавления в кэш. Часто это не проблема, но иногда желательно, чтобы вызывающая сторона участвовала в определении того, как обрабатывать конфликты кэша или другие конфликты.

Тем не менее, если вы в конечном итоге определите, что асинхронные операции действительно повысят производительность, вам следует рассмотреть возможность использования пула потоков, а не выделенного потока для добавления элементов. Использование пула потоков более эффективно, чем запуск выделенные потоки, и, как правило, в результате более масштабируемые. Это может быть легко достигнуто в C # с помощью асинхронного вызова делегата:

// acquire a delegate to the add method
Action<object> addToThreadPool = YourCache.Add; 

// fire and forget, async invoke:
addToThreadPool.BeginInvoke( someItemToAdd, addToThreadPool.EndInvoke, null );
0 голосов
/ 19 января 2011

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

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

За исключением того, что я бы сказал, что Л.Бускин назвал в голове имя об использовании пула потоков для его обработки.

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