Користувальницькькі налаштування

Налаштування сайту


Сайдбар

Розділи

Загальний опис
Історія змін
Рекомендації до оновлення
Плани на майбутнє
Відомі проблеми
Онлайн демо
Допомога проекту
Люди
Трохи про безпеку

FAQ



Редагувати сайдбар

ubillingcache

Це стара версія документу!


Подсистема кэширования

Представляет из себя штатный уровень абстракции для задач требующих кэширования данных на определенное время. Присутствует в составе, начиная с Ubilling 0.6.8. Все брутально и прямолинейно как всегда. Реализовано в виде класса UbillingCache и управляется следующими опциями alter.ini:

; Устанавливает тип хранилища системного кэша, возможные значения:
; files - в файлах, используется по-умолчанию, не требует конфигурации
; memcached - использует Memcached для кэширования данных в оперативной памяти на основе хеш-таблиц
; redis - использует Redis как сетевое журналируемое хранилище данных типа "ключ — значение"
; fake - фэйковый кэш - считается, что он всегда пуст
UBCACHE_STORAGE=files
; Необязательные опции, устанавливающие если требуется альтернативные параметры memcached и redis
;MEMCACHED_SERVER=localhost
;MEMCACHED_PORT=11211
;REDIS_SERVER=localhost
;REDIS_PORT=6379
;Включает запись логирования работы кэша в exports/cache.log. Оно убивает быстродействие и используется только для отладки.
;UBCACHE_DEBUG=1

Пример использования

Вся работа с классом намотана вокруг метода getCallback:

$cache = new UbillingCache(); // Создаем объект
$cacheTime=60; // в секундах
$someData = $cache->getCallback('EXAMPLE_KEY', function () {
    return (web_AnalyticsPaymentsMonthGraph('2015'));
}, $cacheTime);
 
//показываем результат
show_window(__('Example data from cache'), $someData);

Стоит заметить, что вы можете не париться о сериализации своих данных при засовывании в кэш. На выходе вы получите тот же тип данных, который предполагался изначально. А что по скорости? А как-то так: Бенчмарки и всякое такое

ООП или использование в своем классе

Для протаскивания свойств вашего объекта внутрь анонимной функции коллбека вам придется использовать небольшой хак.

     public function sampleFunction() {
        $result = '';
        $this->initCache(); // тут мы инициализируем общий для объекта экземпляр кэша
                            // а именно создаем $this->cache и $this->timeout
        $obj = $this; // а вот собственно и хак
        $result = $this->cache->getCallback('SAMPLE_FUNCT_CACHE', function() use ($obj) {
            return ($obj->getLargeData()); // к сожалению getLargeData может быть только публичным методом
        }, $this->timeout);
        return ($result);
    }

Очистка

Хотя данные из кэша самостоятельно удаляются по прошествии времени $expiration указываемого в секундах, возможно вам потребуется очистить данные кэша “вот прямо сейчас”. Для принудительной очистки конкретного ключа кэша, мы можем использовать публичный метод delete как-то так:

$cache->delete('EXAMPLE_KEY');

А если без наркомании?

Начиная с релиза 0.8.5 вы можете использовать это все просто на уровне set/get указывая время хранения в кэше. Да, в этом случае нам придется самим решать когда и как засовывать данные в кэш, в случае его устаревания.

Как-то так:

$cache=new UbillingCache();
$cacheTime=60;
$dataToPush='sample data';
 
 
//пытаемся получить данные из кэша
$dataInCache=$cache->get('CACHE_TEST_KEY', $cacheTime);
if (!empty($dataInCache)) {
    //если чего-то получено - показываем это в окошке
    show_window(__('Data from cache'),$dataInCache);
} else {
    //запихиваем данные в кэш на сколько нам нужно времени
    $cache->set('CACHE_TEST_KEY', $dataToPush, $cacheTime);
    show_warning(__('No data in received, cache expired'));
}

Следует также помнить, что в при прямой работе с помощью set/get рекомендуется указывать таймаут кэширования в обоих функциях. Так как для стораджей типа memcached или redis на таймаут хранения данных, влияет непосредственно set и реализован средствами самого хранилища а для хранилища files по вполне понятным причинам, актуальность содержащихся данных проверяется во время осуществления get (файлы на ФС не умеют сами по-по себе удаляться, удивительно, да?)

Memcached

Вополне понятно, что для UBCACHE_STORAGE=memcached требуется включенный и работающий сам memcached.

/etc/rc.conf

memcached_enable="YES"
memcached_flags="-l 127.0.0.1 -m 128 -I 10M"
 # /usr/local/etc/rc.d/memcached restart

Redis

Если в вашу сборку пакетов устанавливаемых UBinstaller (в новых бинарниках уже должен быть) не входит Redis, вы можете доустановить его вручную.

Как проверить есть ли он? Да просто методом pkg info | grep redis. Если нету - устанавливаем, если есть - переходим к включению и запуску.

# cd /usr/ports/databases/redis
# make && make install 
# cd /usr/ports/databases/pecl-redis
# make && make install 
# apachectl restart
# /usr/local/etc/rc.d/redis start

Включаем в /etc/rc.conf

redis_enable="YES"

с последующим запуском

# service redis restart

Хочу особенное хранилище

Допустим, по какой-то причине, вам хочется в каком-то вашем, конкретном модуле использовать хранилище кэша отличающееся от указанного в опции UBCACHE_STORAGE. Допустим вам требуется много быстрого чтения memcached, а для остальной системы вы используете redis который в данном конкретном случае оказывается менее продуктивным исходя из бенчмарков. Либо вы используете memcached с маленькими ключами, но вам резко требуется положить в кэш какой-то больший объем данных помещающийся в files либо redis к которому вы не ожидаете очень частых обращений. В таком случае, начиная с релиза 1.1.5 вы можете использовать переопределение типа хранилища прямо в конструкторе класса, например так:

$this->cacheFiles = new UbillingCache('files'); // здесь я хочу файловый кэш, "потому-что".
$this->cacheRedis = new UbillingCache('redis'); // а для этого экземпляра - редис. 
// а в конфиге для всей остальной системы у нас будет вообще memcached и все это только потому, что наркотики - зло.
ubillingcache.1664019551.txt.gz · Востаннє змінено: 2022/09/24 14:39 повз 127.0.0.1