Niech istnieje strona o dużej liczbie użytkowników oraz pewien zasób w Memcache o danym kluczu. Za cache znajduje się jedna baza danych z której, w przypadku braku cache lub jego nieważności, przez odwiedzającego usera zostaną pobrane dane do cache.
W sytuacji kiedy ważność danych dla naszego klucza wygasa, może dojść do wyścigu pomiędzy odświeżającymi stronę userami, wszyscy jednocześnie będą starali się odświeżyć cache (czas wyciągania danych z bazy jest krótki ale nie aż tak krótki aby go zupełnie pominąć). Aby do tego nie dopuścić trzeba mieć pewien mechanizm synchronizacji pozwalający tylko jednemu użytkownikowi (lub małej ich ilości) odświeżyć cache.
No i pytanie, jak? Na pewno struktury IPC jądra Linux odpadają, nie ma jednej przestrzeni adresowej jądra bo jest kilka serwerów aplikacji. Mechanizmy GET_LOCK() z MySQL wariują trochę za bardzo (pconnect lub SQLRelay). Implementacja w Memcache także nie zawsze działa, aczkolwiek jest w miarę stabilna:
1. Utwórz zasób blokadę metodą add()
2. Zablokuj wszystkie inne wątki próbujące go utworzyć (add() teoretycznie pozwoli zrobić to tylko raz, praktycznie nie zawsze)
3. Odśwież cache
4. Usuń zasób remove()
5. Korzystaj z cache
Czy ktoś spotkał się z tym problemem, i zna jakąś przetestowaną implementację?