значит столкнуля с таким случаем
ммм
для начала расскажу как это все делалось и делаеться
protected function afterSave(){
Yii::app()->cache->delete('__KEY__');
}
public static function getAllRegions(){
$cache = Yii::app()->cache;
$regions = $cache->get('__KEY__');
if(!$regions){
$regions = Region::model()->findAll();
if($cache && $regions)
$cache->set(..., $regions);
}
return $regions;
}
- достаточно легко игвалидировать кеш если что то изменилось
-
в кеш суеться массив объектов (много памяти)
-
плохо работает с зависмостями например нельзя получить из кеша $region->cities
нужно будет вызывать City::getAllCities($regionId) что в свою очеред снова будет кешировать объекты
потом я подумал а почему бы не сделать зависимость кеша и убрать эти статические методы
и придумал другой способ
создаем таблицу (можно в памяти) а можно и просто ассоциативный массив прям сразу в кеш всунуть
дальше буду использовать слово таблица
таблица представляет собой key-value хранилище, где value - по сути обычный счетчик
расширяем класс CActiveRecord
добавляем метод, скажем, invalidateCache($keys)
инвалидация ключа происходит путем простого увеличения счетчика.
вызываеться после удаления, обновления или еще гдето…
добавляем метод getKeyDependency($key) который по ключу строит нашу зависимость
далее гдето в коде мы уже используем не Region::getAllRegion()
а
$regions = Region::model()->cache(0, $this->getKeyDependency('some key'))->findAll();
или же
$cities = $region->cache(0, $this->getKeyDependency($region->id)))->cities;
где последнее cities связь HAS_MANY описанная в Region::relations
инвалидировать же города в регионе мы сможем, скажем так
class City extends OurNewClass{
protected function afterSave(){
$this->invalidateCache(array($this->regionId));
}
}
-
храним не массив моделей, а поменьше (все равно объект но памяти жрет меньше)
-
сама таблица с ключами будет оооочень небольшой обрабатываться будет быстро
-
становиться вообщем то легко применять кешрование для связаных таблиц (relations) без написания этих статических методов
- даже не знаю, изначально думал хранить таблицу ключей в БД и это был минус - суть кеша вроде как в том что бы вообще БД не дергать, а получалось что все равно приходилось, потом уже прикинул что таблицу то можно и в памяти создать и даже в тот же кеш всунуть.
так что явных минусов не вижу.
Предвижу ваши вопросы по поводу как формировать ключи в таблице, ну например так
function invalidateCache($keys){
foreach($keys as $key){
$key = md5($this->tableName() . $key);
//....
}
}
-
вообщем как вам идея?
-
есть ли какието предложения по поводу как ее улучшить?
-
или может вообще ее выбросить?
-
формирование ключей что я показал конечно не ахти - будут проблемы при таком подходе!
но может есть идеи как и это поправить?