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

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


ubillingcache

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Остання ревізія По сторонах наступні версії
ubillingcache [2018/08/03 01:46]
ubillingcache [2022/09/24 14:39]
127.0.0.1 зовнішнє редагування
Рядок 1: Рядок 1:
 +====== Подсистема кэширования ======
  
 +Представляет из себя штатный уровень абстракции для задач требующих кэширования данных на определенное время. Присутствует в составе, начиная с Ubilling 0.6.8. Все брутально и прямолинейно как всегда. Реализовано в виде класса UbillingCache и управляется следующими опциями [[alteriniconf|alter.ini]]:
 +
 +<code 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
 +</code>
 +
 +====== Пример использования ======
 +Вся работа с классом намотана вокруг метода **getCallback**:
 +
 +<code php>
 +$cache = new UbillingCache(); // Создаем объект
 +$cacheTime=60; // в секундах
 +$someData = $cache->getCallback('EXAMPLE_KEY', function () {
 +    return (web_AnalyticsPaymentsMonthGraph('2015'));
 +}, $cacheTime);
 +
 +//показываем результат
 +show_window(__('Example data from cache'), $someData);
 +</code>
 +Стоит заметить, что вы можете не париться о сериализации своих данных при засовывании в кэш. На выходе вы получите тот же тип данных, который предполагался изначально.
 +А что по скорости? А как-то так: [[labs#ubillingcache_files_vs_memcached_vs_redis|Бенчмарки и всякое такое]]
 +
 +====== ООП или использование в своем классе ======
 +
 +Для протаскивания свойств вашего объекта внутрь анонимной функции коллбека вам придется использовать небольшой хак.
 +
 +<code php>
 +     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);
 +    }
 +</code>
 +
 +====== Очистка ======
 +Хотя данные из кэша самостоятельно удаляются по прошествии времени $expiration указываемого в секундах, возможно вам потребуется очистить данные кэша "вот прямо сейчас". Для принудительной очистки конкретного ключа кэша, мы можем использовать публичный метод **delete** как-то так:
 +<code php>
 +$cache->delete('EXAMPLE_KEY');
 +</code>
 +
 +====== А если без наркомании? ======
 +Начиная с релиза 0.8.5 вы можете использовать это все просто на уровне set/get указывая время хранения в кэше. Да, в этом случае нам придется самим решать когда и как засовывать данные в кэш, в случае его устаревания.
 +
 +Как-то так:
 +
 +<code php>
 +$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'));
 +}
 +</code>
 +
 +Следует также помнить, что в при прямой работе с помощью set/get рекомендуется указывать таймаут кэширования в обоих функциях. Так как для стораджей типа memcached или redis на таймаут хранения данных, влияет непосредственно set и реализован средствами самого хранилища а для хранилища files по вполне понятным причинам, актуальность содержащихся данных проверяется во время осуществления get (файлы на ФС не умеют сами по-по себе удаляться, удивительно, да?)
 +
 +
 +====== Memcached ======
 +Вополне понятно, что для UBCACHE_STORAGE=memcached требуется включенный и работающий сам memcached. 
 +
 +/etc/rc.conf
 +<file ini>
 +memcached_enable="YES"
 +memcached_flags="-l 127.0.0.1 -m 128 -I 10M"
 +</file>
 +
 +
 +<code bash>
 + # /usr/local/etc/rc.d/memcached restart
 +</code>
 +
 +====== Redis ======
 +Если в вашу сборку пакетов устанавливаемых [[setupubinstaller|UBinstaller]] (в новых бинарниках уже должен быть) не входит Redis, вы можете доустановить его вручную.
 +
 +Как проверить есть ли он? Да просто методом  **pkg info | grep redis**. Если нету - устанавливаем, если есть - переходим к включению и запуску.
 +
 +<code>
 +# 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
 +</code>
 +
 +
 +Включаем в /etc/rc.conf
 +<code ini>
 +redis_enable="YES"
 +</code>
 +
 +с последующим запуском
 +<code>
 +# service redis restart
 +</code>
 +
 +====== Хочу особенное хранилище ======
 +
 +Допустим, по какой-то причине, вам хочется в каком-то вашем, конкретном модуле использовать хранилище кэша отличающееся от указанного в опции UBCACHE_STORAGE. Допустим  вам требуется много быстрого чтения memcached, а для остальной системы вы используете redis который в данном конкретном случае оказывается менее продуктивным исходя из бенчмарков. Либо вы используете memcached с маленькими ключами, но вам резко требуется положить в кэш какой-то больший объем данных помещающийся в files либо redis к которому вы не ожидаете очень частых обращений. В таком случае, начиная с релиза 1.1.5 вы можете использовать переопределение типа хранилища прямо в конструкторе класса, например так:
 +
 +<code php>
 +$this->cacheFiles = new UbillingCache('files'); // здесь я хочу файловый кэш, "потому-что".
 +$this->cacheRedis = new UbillingCache('redis'); // а для этого экземпляра - редис. 
 +// а в конфиге для всей остальной системы у нас будет вообще memcached и все это только потому, что наркотики - зло.
 +</code>
ubillingcache.txt · Востаннє змінено: 2023/06/16 15:39 повз nightfly