Jestem w trakcie pisania pewnego bardziej obciążonego serwisu i stanąłem przed pewnym problemem, który nie daje mi ostatnio spać. winksmiley.jpg

Mianowicie, chodzi o sposób zapisywania relacji między poszczególnymi obiektami. Wiadomo, że standardem jest zapisywanie par [namespace/grupa], klucz, wartość.

Jednak czasem sam namespace jest niewystarczający, mianowicie - jest obiekt i powiązany z nim inny, ale w ramach innego namespace'a. I tu jest pies pogrzebany:
  • czyszczenie całego cache, czy też powiązanych namespace (w gruncie rzeczy, wychodzi na to samo) to najgorsze rozwiązanie (choć najprostsze winksmiley.jpg)
  • zbudowanie jakiegoś miejsca przechowywania relacji między obiektami

I to drugie jest - oczywiście - najlepsze, ale zachodzi problem w implementacji. Załóżmy, że cały cache jest powierzony memcached (shm odpada z racji tego, że działa tylko w konkretnej instancji interpretera). I przyszło mi do głowy kilka pomysłów:

  • trzymanie zserializowanej tablicy z powiązaniami w ramach jednego z buforów memcached
  • zapisanie relacji w bazie SQLite (ale wtedy konieczne jest trzymanie tego gdzieś w plikach)


Co do tego drugiego, to w celu uniknięcia zbędnych lagów, chciałbym też przetrzymywać w RAM (a co, walczę o milisekundy, u mnie warto winksmiley.jpg), przyszły teraz do głowy dwa pomysły:
  • ramfs
  • stream_wrapper_register - ale raz - nie wiem, czy to na 100% zadziała stabilnie (mam pewne obawy, do tego konieczność duplikowania zawartości (zmienna z buforem), ale to można ostatecznie przeboleć), większy problem, to zablokowanie komórki w memcached na czas aktualizacji zmiennej operacjami I/O do pliku bazy. Na dysku zostałyby zmienione tylko niezbędne bajty, a tu za każdym razem trzeba transportować całość; sęk w tym, że (za: http://www.php.net/manual/en/function.memcache-add.php#82277) memcached dla PHP nie ma zaimplementowanego blokowania komórek


Hmm, parę rzeczy mi się wyklarowało w trakcie pisania tego posta, ale co Wy na ten temat sądzicie? Szczególnie problem tego ostatniego podpunktu. Na ramfs nie zawsze jest miejsce, jeśli chodzi o memcached/itp, to już jest lepiej.

PS. Nie liczę na odpowiedzi w stylu nie przejmuj się, pchaj na dysk, bo ja walczę o cenne ms. ;] Można potraktować ten problem jako wyzwanie, a nie cel sam w sobie. ;]