извините, у меня много вопросов о блокировке / кэше. = _ = ..
-> 1. о кеше, я знаю, что кэш в asp.net является поточно-ориентированным, простой код, который я обычно использую, -
IList<User> user= HttpRuntime.Cache["myCacheItem"] as IList<User>;
if (user == null)
{
//should i have a lock here?
//lock(some_static_var){...}
HttpRuntime.Cache["myCacheItem"] = GetDateFromDateBase();
}
return user;
следует использовать блокировку в коде?
-> -> 1.1 если я использую, может быть, я должен объявить много lockitem? я видел некоторую реализацию на сервере сообщества, он использует статический словарь для хранения элемента блокировки, это хорошая идея? потому что я обеспокоен тем, что в словаре может быть слишком много блокировок и это может замедлить работу системы.
-> -> 1.2, если я не буду использовать, что произойдет? просто возможно два или более потоков обращаются к GetDateFromDateBase()
? если только это, я думаю, что я могу снять блокировку.
-> 2.У меня есть общий словарь, хранящийся в кэше, я должен его изменить (добавить / обновить / удалить). и я просто использую его, чтобы получить значение, как dic.trygetvalue (ключ), не зацикливайте его.
-> -> 2.1, если я могу гарантировать, что изменение происходит только в одном потоке, например,
a.aspx -> прочитать словарь из кэша и отобразить на странице, открытой для пользователя
b.ashx -> изменит словарь при его вызове (цикл за 5 минут), частное использование
я должен использовать блокировку в a / b? заблокировать читатель и писатель?
-> -> -> 2.11, если я не использую блокировку, что произойдет? Вызовет ли исключение, когда читатель и писатель получат доступ одновременно?
-> -> -> 2.12, если я просто заблокирую писателя в b.ashx, что произойдет? будет ли заблокирован ридер в .aspx? и как лучше всего справляться с этой ситуацией?
-> -> 2.2, если читатель и писатель произошли в многопоточном доступе. они оба на общедоступной странице.
a.aspx -> только что прочитал из кеша
b.aspx -> изменить словарь
что делать? заблокировать все?
-> -> 2.3, если я реализую новую функцию добавления словаря:
это просто скопировать текущий словарь в новый словарь, а затем добавить новый элемент или изменить
и, наконец, вернуть новый dic, он решит проблему параллелизма?
решит ли хеш-таблица эти проблемы?
как определить, что предмет должен быть заблокирован? я думаю, что я не прав в этих вещах = _ =.
-> 3. последний вопрос .. у меня есть два веб-приложения
a -> показать сеть
b -> отобразить некоторые настройки
у них обоих есть собственный кеш, что я могу сделать одновременно с двумя кешами?
будет ли операция в [2.1] правильной или другой операцией? (я проверяю memcached, но он работает слишком медленно, чем в веб-приложении, поэтому я использую только две)
спасибо, что прочитали все -_-...
хотел бы ты знать, что я говорю :) 1031 *
Обновление ======================================== ==============
Спасибо за ответ Аарона. после прочтения его ответа я пытаюсь ответить самому себе.
1. о кеше, если данные не изменятся, он может сначала прочитать в кеш в Application_Start (global.asax).
1.1 Если блокировка, я должен добавить блокировку начала при чтении данных, а не только при записи. элемент блокировки должен быть статичным, но я также не чувствую уверенности в отношении 1.1.
1.2 Да, если вы можете предположить, что код просто считывает дату из базы данных, а затем вставляет в кеш и не изменится (верно? -_-). результат этого может быть прочитан несколько раз из базы данных. Я думаю, что это не большая проблема.
2. Общий словарь записи не является потокобезопасным, поэтому он должен быть заблокирован при изменении. Чтобы решить эту проблему, я могу использовать неизменный словарь.
но если я использую ConcurrentDictionary
(threadsafe при чтении / записи) в .net4.0 или сам реализую новый словарь (использую блокировку чтения-записи), это решит? Нужно ли снова его блокировать при изменении? код похож на
ConcurrentDictionary user= HttpRuntime.Cache["myCacheItem"] as ConcurrentDictionary;
if (user == null)
{
//is it safe when the user is ConcurrentDictionary?
HttpRuntime.Cache["myCacheItem"] = GetDateFromDateBase();
}
else
{
//is it safe when the user is ConcurrentDictionary?
user["1"] = a_new_user;
}
3. вопрос в том, что у меня есть небольшое приложение, такое как stroe, у него есть два веб-приложения: одно - сайт магазина (A), а другое - сайт управления (B), поэтому мне нужно одновременно использовать два веб-кэша, например, если я изменяю цену продукта в B, как я могу уведомить сайт A об изменении / удалении кэша? (я знаю, что кэш в A может установить короткое замыкание, но это не быстро, поэтому я хочу знать, есть ли там внутренний поддержка в asp.net или просто как вопрос 2.1? есть страница aspx / ashx для вызова?)