Cachowanie mysql

Piszac moj act_as_tree element natknole sie na dziwne zachowanie sie tego plugin w production z wlaczonym caching classes. Otoz jezeli mialem zadeklarowana jakas wartosc dla klasy np:

def self.foo @bar = Time.now unless @bar end
to wartos @bar byla cachowana w obrebie nie jednego requestu ale wszystich requestow, zmieniala sie dopiero gdy @bar bylo nil czyli po restarcie aplikacji :slight_smile: Musialem dodac after_save i after_destroy @bar = nil aby moc w jakikolkwikek sposob te dane odswiezac poniewaz w mojej aplikacji te dane byly wykorzystywane wielokrotnie przez plugin. Teraz po rozwiazaniu tego problemu niedosc ze dane sa wykorzystywane wieloktronie w 1 requescie to dzieje sie tak samo we wszystich requestach, a @bar jest czyszczone dopiero po after_save lub after_destroy.

Jednym slowem, przy wlaczonym cachowaniu klas i ustawianiem jakiejs wartosci dla klasy mamy tak jakby shared memory :slight_smile: i przyszlo mi do glowy ze mozna by w ten sposob stworzyc swietny system cachowania dla ActiveRecord. Co by bylo potrzebne?

  1. Nadpisanie wszystkich metod odwolujacych sie do bazy danych, kazda metoda ktora wykorzystuje jakias instrukcjie sql UPDATE, INSERT zamiast odwolywac sie do bazy danych w pierwszej kolejnosci sprawdzala by czy dane przypadkiem nie istnieja juz w cache. Jezeli nie to wykonuje zapytanie sql dodaje do cache rezultat oraz zwraca go.
  2. Metody after_save i after_destroy powinny robic flush cache dla wszystkich zapytan ktore sa powiazane z dany modelem.

Teoretycznie powinny chyba wystarczyc 2 zmienne Hash do tego jedna jako indeks z nazwami modeli druga jako indeks z zapytaniami oraz juz rezultatami z tych zapytan.

Dzieki temu otrzymalibysmy system ktory maksymalnie jak to tylko mozliwe minimalizowal by odwolania do bazy danych, oraz zutowanie na activerecord. Nie wiem tylko jaki aktualnie mamy system cachowania ? Jest jakis ? Moze jest lepszy i nie warto :slight_smile: Oczywiscie ten system mialby tylko sens z wlaczonym cachowaniem klas, mozna by to tez zrobic na bazie jakiegos modulu pamieci dzielonej dla rubego.

Edit: jak zwykle nie wymyslilem nic nowego act_as_cached robi z grubsza to co napisalem :smiley: tyle ze za pomoco memcached, z tym ze ja tu mysle o czyms owiele bardziej przezroczystym.

Ja się właśnie nad memcached zastanawiałem.
W tej serii artykułów o optymalizacji aplikacji railsowej bardzo sobie go chwalą :slight_smile:

Ktos juz wrzucal wyklad z memcached dla rails :slight_smile: To sie przydaje tylko w naprawde mocno opciazaonych aplikacjach powyzej 3 tys req/s

Dzięki za info. Poczytałem, douczyłem się, zauważyłem błędy w rozumowaniu :wink: