Raczej tak:
1. Kazdy kesz identyfikujemy po nazwie, ktora jest unikalna (np: "ranking-desc-page-2", "profil-usera-id-4234")
2. Z nazwy generujemy id kesza robiąc md5($nazwa) (czyli wyjdzie cos w tym stylu "a2cd34b5efdf346..").
3. Sprawdzamy, czy plik o nazwie [$id.txt] istnieje w katalogu cache, jesli tak to sprawdzamy czy zostal on zmodyfikawany $x sekund temu, gdzie $x to ustalony czas waznosci kesza. Jezeli ten kesz jest dobry to go odserializowujemy i dajemy do zmiennej $wynik oraz przechodzimy do punktu 5.
4. Jesli nie jest dobry to trzeba wygenereowac nowy wynik, dac go dop zmiennej $wynik i zapisac go zserializowanego do pliku o nazwie [$id.txt]
5. Zwracamy $wynik.
Tak wyglada mniej wiecej schemat funkcji ktora ma keszowac swoj wynik

Jesli $x ustawimy na 999999999 to znaczy ze jest to kesz o "nieskonczej" dacie waznosci, i zeby go odnowic to musimy skasowac jego plik. Czasami jest to przydatne.
edit:
Nazwy mozna latwo generowac dla zapytań po prostu kopiujac do niej kod sql, i dajac na poczatek nazwe funkcji czy cos, np:
"getArticles - SELECT * FROM articles WHERE 1 ORDER BY updated_at"
wtedy stworza sie rozne pliki dla tej funkcji, jezeli ona czasam pobiera artykuly posortowane rosnaco, albo jesli jest paginacja.