ФорумПрограммированиеПыхнуть хотите?Готовые решения → Cache класс с Lock'ами PHP5.3

Cache класс с Lock'ами PHP5.3

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 июля 2010 г. 11:04

    ку. в общем понадобился кеш класс, который поддерживает "локи" для одновременного чтения/записи данных в 1 ячейку. вот такое "изобретение", ага возможно есть и под зф и под другие, ссылки если дадите ознакомлюсь, но юзать буду свое :)

    вещь сырая, но лочит и читает при локах нормально, можно юзать :)

    <?php

    class Cache
    {

       /**
        * Cache adapter
        * @var Cache_ICache
        */
       protected $adapter;

       public function __construct(Cache_ICache $adapter)
       {
           $this->adapter = $adapter;
       }

       /**
        * Singleton redis cache object
        * @return Cache
        */
       public static function instance()
       {
           static $cache;
           if (!$cache)
           {
               $cache = new self(Cache_Redis::instance());
           }

           return $cache;
       }

       public function get($key, $locks = true)
       {
           if ($locks)
           {
               $lock = "lock." . $key;
               while ($this->adapter->get($lock) >= microtime(true))
               {
                   usleep(100000);
               }
           }

           return $this->adapter->get($key);
       }

       public function set($key, $value, $locks = true)
       {
           $lock = "lock." . $key;
           if ($locks && $value instanceof Closure)
           {
               $this->adapter->set($lock, 1);
               $this->adapter->expire($lock, 5);
           }

           if ($value instanceof Closure)
           {
               $value = $value();
           }

           $this->adapter->set($key, $value);

           if ($locks && $value instanceof Closure)
           {
               $this->adapter->delete($key);
           }
       }

       public function expire($key, $ttl)
       {
           return $this->adapter->expire($key, $ttl);
       }

       public function delete($key)
       {
           return $this->adapter->delete($key);
       }

    }


    работает с адаптером, чо там на конце ему похуй, знает 4 функции. на данный момент этот функционал меня и инетерсует.

    локи используются под пхп5.3, давно я дрочил на замыкания в жс, надо же, добрались и до пхп :) неймспейсы меня все еще не радуют, но если елки-палки, то блин придется на этих лыжах ездить видимо :)

    пример работы.

                $object = $cache->get($name);
               if (!$object)
               {
                   $object = $cache->set($name, function () use ($id, $class)
                                   {
                                       return $class::getDbRow($id, $class::getTable());
                                   }
                   );
                   $cache->expire($name, $class::$cachetime);
               }


    ну и интерфейсик

    interface Cache_ICache
    {

       public function get($key);

       public function set($key, $value);

       public function delete($key);

       public function expire($key, $ttl);
    }

    работает ТОЛЬКО под пхп5.3+. я все еще дрочу на замыкания, чую скоро все библиотеки свои на поддержку замыканий переведу :D
    Спустя 130 сек.
    ну и думаю очевидно, что функция гет по умолчанию работает с ожиданием разлочивания строчки, а функция сет, если ей передают замыкание в качестве значения, то она ставит лок, выполняет функцию, снимает лок и возвращает значение этой функции, складывая значение в кеш. все просто, профит :)
    Сапожник без сапог
  • soul

    Сообщения: 790 Репутация: N Группа: Кто попало

    Spritz 26 июля 2010 г. 11:19, спустя 14 минут 18 секунд

    прикольно, мне нравится.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 июля 2010 г. 11:48, спустя 29 минут 33 секунды

    фу, синглтон
    Спустя 22 сек.
    и хде неймспейсы?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 июля 2010 г. 11:51, спустя 2 минуты 19 секунд

    и хде неймспейсы?

    это была философия, на данном проекте я байтодрочу, поэтому синглтон :)

    лишние полмегабайта на создание объекты реестра мне важны :)
    Спустя 28 сек.
    я показал идею as is, а дальше сами, возможно кому то пригодится :)
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 июля 2010 г. 11:56, спустя 5 минут 10 секунд

    дык ничего нового, какая идея? Разве что замыкание в set, но это очень сомнительное удобство
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 29 июля 2010 г. 3:36, спустя 2 дня 15 часов 40 минут

    я тут недавно читал
    Многие забывают, что DBM-файлы чрезвычайно быстры и предназначены для обеспечения высокоскоростного одновременного доступа для чтения чтения/записи к локальным данным.
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 30 июля 2010 г. 20:40, спустя 1 день 17 часов 3 минуты

    Padaboo, хорош Шлосснейгла телепать, файл кешь уходит в прошлое
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 июля 2010 г. 20:52, спустя 11 минут 49 секунд


    Padaboo, хорош Шлосснейгла телепать, файл кешь уходит в прошлое
    в жесткое прошлое
    Спустя 32 сек.
    у меня редиска при бенчмарке держит 180к хитов в секунду безо всяких настроек (я хз может в лимиты какие то упирается)
    Сапожник без сапог
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 30 июля 2010 г. 23:33, спустя 2 часа 41 минуту 14 секунд

    хорош Шлосснейгла телепать

    спалился =)
    у меня редиска при бенчмарке держит 180к хитов в секунду безо всяких настроек (я хз может в лимиты какие то упирается)

    в оперативку
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 июля 2010 г. 23:35, спустя 1 минуту 52 секунды

    в оперативку

    ддр3 12 гб :) врядли ;)
    Сапожник без сапог
  • Padaboo

    Сообщения: 477 Репутация: N Группа: Адекваты

    Spritz 30 июля 2010 г. 23:36, спустя 37 секунд

    phpdude
    в принципе говорю … =)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!