Альтернативный пакет cache

Вопросы, связанные с разработкой пакетов Limb3

Модератор: phpBB2 - administrators

Сообщение serega » Вт ноя 11, 2008 3:28 pm

Конечно, описание кешей только конфигами не всегда подходит. Например, есть случаи, когда для разных типов пользователей нужно создавать различные кеши. Но для простых случаев - описание конфигами, думаю, будет полезным.
serega
LIMB Developer
 
Сообщения: 1418
Зарегистрирован: Чт июн 10, 2004 1:03 pm
Откуда: Penza, Russia

Сообщение korchasa » Вт ноя 11, 2008 3:36 pm

serega писал(а):Конечно, описание кешей только конфигами не всегда подходит. Например, есть случаи, когда для разных типов пользователей нужно создавать различные кеши. Но для простых случаев - описание конфигами, думаю, будет полезным.

Ну так LIMB-way:
"Автоматизируем 90% функционала, не усложняя жизнь остальным 10%" :wink:
Ну по крайней мере для меня.
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 936
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение pachanga » Вт ноя 11, 2008 5:10 pm

...и все же, я очень рекомендую переназвать, пока не поздно, классы в пакете, добавив префикс 2....

Это полезная практика, например, http://pear.php.net/package/MDB2, http://pear.php.net/package/XML_HTMLSax3 и т.д
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение korchasa » Вт ноя 11, 2008 5:18 pm

pachanga писал(а):...и все же, я очень рекомендую переназвать, пока не поздно, классы в пакете, добавив префикс 2....

Это полезная практика, например, http://pear.php.net/package/MDB2, http://pear.php.net/package/XML_HTMLSax3 и т.д

А почему может быть поздно? Включим в релиз один из пакетов. Просто не хочется чтобы потом он так и остался cache2(если выберем его как основной), из-за того, что в это завязано в коде приложений. Предлагаю нейтральный вариант - сделать его бранчем пакета cache.
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 936
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение pachanga » Вт ноя 11, 2008 5:21 pm

korchasa писал(а): Предлагаю нейтральный вариант - сделать его бранчем пакета cache.


Э...это как? :P
Аватара пользователя
pachanga
LIMB Developer
 
Сообщения: 4504
Зарегистрирован: Вс июн 06, 2004 7:29 pm
Откуда: Russia, Penza

Сообщение korchasa » Вт ноя 11, 2008 5:32 pm

pachanga писал(а):
korchasa писал(а): Предлагаю нейтральный вариант - сделать его бранчем пакета cache.
Э...это как? :P

Тупанул. Забыл, что у нас репозиторий на весь лимб.
ЗЫ: Все равно не понимаю что плохого в совпадении имен, кроме того, что "не красиво". Т.е. если бы их использовали совместно, то все ясно - надо переименовывать. А если раздельно, то зачем?

ЗЫ: В принципе, можно его вообще из основного репозитория переместить куда-нибудь.
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 936
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение conf » Ср дек 10, 2008 2:24 pm

korchasa писал(а):
korchasa писал(а):... Насчет того, что использовать - пока не знаю. lmbMintCache медленнее, но надежнее. Возможно стоит его использовать. Просто я пока не знаю, как лучше описывать цепочки кэшей. Например, как сделать тэгируемый mint-кэш, без большого оверхеда по операциям, на основе конфига.

В общем пока думаю сделать как-то так:
Код: Выделить всё
//cache.conf.php
$conf['default'] = 'memcache://localhost';
$conf['template'] = 'mint://?conn=default&default_ttl=300';

//запрос кэша
lmbToolkit::instance()->getCache('template')->get('news');


соответственно, если нам нужно выводить на экран информацию о запросах:
Код: Выделить всё
//где-то вначале работы (фильтр в цепочке)
$this->getConf('cache')->set('template', 'logged://conn=template&logger=memory');

//где-то вконце, где надо вывести статистику по запросам (тоже фильтр в цепочке)
$this->getCache('template')->getStatistic();


У меня вопрос: у нас есть несколько видов оберток над базовыми кэшами, например, lmbMintCache, lmbLoggedCache и lmbTaggableCache. Их можно как-нибудь использовать вместе? Как будет выглядеть конфиг в таком случае?
Например, конфиг минт-кэша с поддержкой тегов на memcache.
Опыт - это то, что мы получаем, когда не получаем того, что хотим.
http://www.shelfari.com/shein_alexey/shelf - лучшие книги для программистов.
Аватара пользователя
conf
LIMB Addicted
 
Сообщения: 570
Зарегистрирован: Вт мар 25, 2008 6:41 pm
Откуда: Tashkent, Uzbekistan

Сообщение wIliaM » Ср дек 10, 2008 2:36 pm

conf писал(а):У меня вопрос: у нас есть несколько видов оберток над базовыми кэшами, например, lmbMintCache, lmbLoggedCache и lmbTaggableCache. Их можно как-нибудь использовать вместе? Как будет выглядеть конфиг в таком случае?
Например, конфиг минт-кэша с поддержкой тегов на memcache.

мы решаем это следующим образом:
вводим в тулкит методы
Код: Выделить всё
  function getTemplateCache()
  {
    if(is_object($this->template_cache))
      return $this->template_cache;

    lmb_require('limb/cache2/src/lmbMintCache.class.php');
    lmb_require('limb/cache2/src/lmbCache.class.php');

    $conf = $this->toolkit->getConf('cache');

    if($conf->get('cache_enabled'))
    {
      $cache_backend = lmbCache :: createConnection($conf->get('template_cache_dsn'));
      $this->template_cache = new lmbLoggedCache(new lmbMintCache($cache_backend), 'template');
    }
    else
      $this->template_cache = self :: createFakeCache('template');

    return $this->template_cache;
  }


более того добавляем прослойку сервисов(может быть даже это стоит называть DAO), которая является объектной оберткой над кэшем:
Код: Выделить всё
class MemberCacheService
{
  static $members;
...
  static function findMember($member_id)
  {
    if(!$member_id)
      return null;

    if(isset(self :: $members[$member_id]))
      return self :: $members[$member_id];

    $cache = lmbToolkit :: instance()->getMembersCache();

    $member = $cache->get('member_' . $member_id);

    if(!$member && !is_object($member))
    {
      if(!$member = lmbActiveRecord :: findById('Member', $member_id, false))
        return null;

      self :: addMemberToCache($member);
    }

    return $member;
  }
...
}


все это на верхнем уровне позволяет очень прозрачно работать с объектами, даже ничего не зная про кэш. но при этом ничего не мешает при необходимости вклиниться а любой уровень приложения
Аватара пользователя
wIliaM
LIMB Developer
 
Сообщения: 718
Зарегистрирован: Пт июн 04, 2004 11:23 pm
Откуда: Russia, Penza

Сообщение conf » Ср дек 10, 2008 3:13 pm

wIliaM писал(а):
conf писал(а):У меня вопрос: у нас есть несколько видов оберток над базовыми кэшами, например, lmbMintCache, lmbLoggedCache и lmbTaggableCache. Их можно как-нибудь использовать вместе? Как будет выглядеть конфиг в таком случае?
Например, конфиг минт-кэша с поддержкой тегов на memcache.

мы решаем это следующим образом:
вводим в тулкит методы
Код: Выделить всё
  function getTemplateCache()
  {
    if(is_object($this->template_cache))
      return $this->template_cache;

    lmb_require('limb/cache2/src/lmbMintCache.class.php');
    lmb_require('limb/cache2/src/lmbCache.class.php');

    $conf = $this->toolkit->getConf('cache');

    if($conf->get('cache_enabled'))
    {
      $cache_backend = lmbCache :: createConnection($conf->get('template_cache_dsn'));
      $this->template_cache = new lmbLoggedCache(new lmbMintCache($cache_backend), 'template');
    }
    else
      $this->template_cache = self :: createFakeCache('template');

    return $this->template_cache;
  }


более того добавляем прослойку сервисов(может быть даже это стоит называть DAO), которая является объектной оберткой над кэшем:
Код: Выделить всё
class MemberCacheService
{
  static $members;
...
  static function findMember($member_id)
  {
    if(!$member_id)
      return null;

    if(isset(self :: $members[$member_id]))
      return self :: $members[$member_id];

    $cache = lmbToolkit :: instance()->getMembersCache();

    $member = $cache->get('member_' . $member_id);

    if(!$member && !is_object($member))
    {
      if(!$member = lmbActiveRecord :: findById('Member', $member_id, false))
        return null;

      self :: addMemberToCache($member);
    }

    return $member;
  }
...
}

все это на верхнем уровне позволяет очень прозрачно работать с объектами, даже ничего не зная про кэш. но при этом ничего не мешает при необходимости вклиниться а любой уровень приложения


Спасибо за ответ.
В принципе такой необходимости в тулкит-методе нет, все это уже сейчас делает lmbCacheTools::createCache, тулкит-метод скорее необходим для нескольких кэшей одновременно.
Что не понравилось:
1. Есть 3 почти одинаковых интерфейса:
Код: Выделить всё

/**
* interface lmbNonTransparentCache.
*
* @package cache
* @version $Id$
*/
interface lmbNonTransparentCache
{
  function add ($key, $value, $ttl = false);
  function set ($key, $value, $ttl = false);
  function get ($key);
  function delete($key);
  function flush();
}

Код: Выделить всё

/**
* interface lmbNonTransparentCache.
*
* @package cache
* @version $Id$
*/
interface lmbCacheConnection
{
  function add ($key, $value, $ttl = false);
  function set ($key, $value, $ttl = false);
  function get ($key);
  function delete($key);
  function flush();
}

Код: Выделить всё

interface lmbCache
{
  const OPERATION_ADD = 'ADD';
  const OPERATION_SET = 'SET';
  const OPERATION_GET = 'GET';
  const OPERATION_DELETE = 'DELETE';
  const OPERATION_LOCK = 'LOCK';
  const OPERATION_UNLOCK = 'UNLOCK';
  const OPERATION_INCREMENT = 'INCREMENT';
  const OPERATION_DECREMENT = 'DECREMENT';
 
  function set($key, $value);
  function get($key);
  function delete($key);
}

Причем второй явно скопирован с первого (видно по php-doc комментам :)). Нужно разобраться и удалить лишнее, имхо оставить 1 из трех и сделать рефакторинг, т.к. например lmbTaggableCache реализует lmbCache, соответственно, у него нет некоторых операций и его уже нельзя использовать в указанной тобой цепочке.

2. lmbTaggable работает не совсем так как кэш групп в cache1, т.е. он не гарантирует уникальности кэша по тегу. Т.е. ранее следующий код создавал 2 независимых друг от друга кэша, а сейчас второй перезапишет первый.
Код: Выделить всё
$cache->set($key, $value, $tag1, $ttl);
$cache->set($key, $value, $tag2, $ttl);

3. Ну и тесты еще довольно сырые, по крайней мере, у меня валятся dbConnection и logs (да на винде :)).

А так все намного лучше, чем было в первом пакете, спасибо :)
Опыт - это то, что мы получаем, когда не получаем того, что хотим.
http://www.shelfari.com/shein_alexey/shelf - лучшие книги для программистов.
Аватара пользователя
conf
LIMB Addicted
 
Сообщения: 570
Зарегистрирован: Вт мар 25, 2008 6:41 pm
Откуда: Tashkent, Uzbekistan

Сообщение CM-Z » Ср дек 10, 2008 4:30 pm

conf писал(а):А так все намного лучше, чем было в первом пакете, спасибо :)

Жаль только отказались от интерфейса:
Код: Выделить всё
...
  function add ($key, $value, $params = array());
  function set ($key, $value, $params = array());
...

У меня всё так здорово было завязано на $params = array(); Пришлось все мои тулкиты и хелперы капитально переделывать :cry:
CM-Z
LIMB Addicted
 
Сообщения: 164
Зарегистрирован: Сб авг 04, 2007 11:23 pm

Сообщение serega » Чт дек 11, 2008 11:51 am

CM-Z писал(а):
conf писал(а):А так все намного лучше, чем было в первом пакете, спасибо :)

Жаль только отказались от интерфейса:
Код: Выделить всё
...
  function add ($key, $value, $params = array());
  function set ($key, $value, $params = array());
...

У меня всё так здорово было завязано на $params = array(); Пришлось все мои тулкиты и хелперы капитально переделывать :cry:


Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?

Код: Выделить всё
function add($key, $value, $ttl = false, $params = array())
serega
LIMB Developer
 
Сообщения: 1418
Зарегистрирован: Чт июн 10, 2004 1:03 pm
Откуда: Penza, Russia

Сообщение korchasa » Чт дек 11, 2008 12:01 pm

serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?

Ты уже придумал применение? :D
Аватара пользователя
korchasa
LIMB Developer
 
Сообщения: 936
Зарегистрирован: Чт май 10, 2007 3:47 am

Сообщение conf » Чт дек 11, 2008 1:40 pm

korchasa писал(а):
serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?

Ты уже придумал применение? :D

Имхо без $params стало лучше, чище как-то.
Опыт - это то, что мы получаем, когда не получаем того, что хотим.
http://www.shelfari.com/shein_alexey/shelf - лучшие книги для программистов.
Аватара пользователя
conf
LIMB Addicted
 
Сообщения: 570
Зарегистрирован: Вт мар 25, 2008 6:41 pm
Откуда: Tashkent, Uzbekistan

Сообщение serega » Чт дек 11, 2008 3:32 pm

korchasa писал(а):
serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?

Ты уже придумал применение? :D


Пусть CM-Z дасть пример параметра, кроме ttl
serega
LIMB Developer
 
Сообщения: 1418
Зарегистрирован: Чт июн 10, 2004 1:03 pm
Откуда: Penza, Russia

Сообщение conf » Чт дек 11, 2008 3:41 pm

serega писал(а):
korchasa писал(а):
serega писал(а):Хм, а может в cache2 все-таки ввести параметр $params. Но ttl все равно оставить?

Ты уже придумал применение? :D


Пусть CM-Z дасть пример параметра, кроме ttl

теги
Опыт - это то, что мы получаем, когда не получаем того, что хотим.
http://www.shelfari.com/shein_alexey/shelf - лучшие книги для программистов.
Аватара пользователя
conf
LIMB Addicted
 
Сообщения: 570
Зарегистрирован: Вт мар 25, 2008 6:41 pm
Откуда: Tashkent, Uzbekistan

Пред.След.

Вернуться в Limb3 разработка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron