Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memcached блокировка 
:(
    Опции темы
DooZ
Дата 4.3.2009, 00:22 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



Здравствуйте
есть вопрос по memcache

есть данные которые часто меняются (постоянно)
блокировка выглядит следующим образом

Код


// получаем кеш

$cache = $memcache->get('cache');

// если кеша нет, лочимся

    if (!$cache)
    {
        while (1)
        {
            if (!$memcache->add('lock', 1, false, 10))
            {
            usleep(100);
            continue;
            }

// получили блокировку, смотрим, может уже кеш появился

        $cache = $memcache->get('cache');

// если появился, снимаем блокировку и выходим

            if ($cache)
            {
            $memcache->delete('lock');
            break;
            }

// если кеша нет, то создаем пустой массив и выходим, не забыв снять блокировку

        $cache = array();
        $memcache->add('cache', $cache, false, 0);
        $memcache->delete('lock');
        break;
        }
    }

// далее что-то делаем, обновляем данные в нашем кеше $cache
// например увеличили число показов и переходов куда-то (просто пример)

$cache['outs']++;
$cache['shows]++;

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

    while (1)
    {
        if (!$memcache->add('lock', 1, false, 10))
        {
        usleep(100);
        continue;
        }

// заблокировались и обновляем кеш
// сняли блокировку и вышли

    $memcache->set('cache', $cache, false, 0);
    $memcache->delete('lock');
    break;
    }


теперь вопрос, правильная ли это реализация? есть другие способы правильной блокировки при условии, что данные должны быть свежими (нельзя отдавать старые данные)

заранее благодарю

Добавлено через 2 минуты и 28 секунд
забыл сказать, что инкремент в кеше делать нельзя т.к. в данном примере в кеше хранится обычный массив, но на деле там массивы нескольких уровней
типа
$cache[$id]['shows']
$cache[$id]['outs']
и т.д.

создавать кеши для каждого типа
$memcache->add('id_shows_'.$id, 0, false, 10)
и потом инкрементиться, я даже не знаю... можно так делать? ведь таких записей может быть сотни миллионов...
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Может Вам стоит посмотреть в сторону предназначенных для ваших действий программ MySQL и InnoDB/MyISAM?
 Или же, хотя бы, для начала рассказать какую цель вы преследуете, что бы таким образом изгаляться над бедным Мемкешем.

Это сообщение отредактировал(а) IZ@TOP - 4.3.2009, 15:55


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
DooZ
Дата 4.3.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



базы и так задейтвованы в виде бекендов, из мискуля считывается если нет в кеше
а цель простая, вывод информеров (баннеров если хотите), сейчас на данном варианте добился миллиона показов баннеров, нагрузка держется в районе 0.8 - 1.2 (LA), помоему сильно грузится
в таком варианте как написал, при тесте ab -c 10 -n 300 "url" выдает 14 запросов в секунду, мало...

или я не прав?
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Цитата(DooZ @  4.3.2009,  17:20 Найти цитируемый пост)
а цель простая, вывод информеров (баннеров если хотите), сейчас на данном варианте добился миллиона показов баннеров, нагрузка держется в районе 0.8 - 1.2 (LA), помоему сильно грузится


Только я не представляю для чего здесь вообще локи нужны. Если у вас просто вывод информера, вы можете вообще его через ssi подключать, при этом кэшируя Nginx-ом в Memcached напрямую.

А если вас интересует подсчет количества показов информеров, это уже совершенно другой разговор. И в любом случае, подобным образом не решается. Один из противоречащих моментов использования Memcached в качестве сборщика статистики то, что он не гарантирует 100% хранение.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
DooZ
Дата 4.3.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



да именно учет статистики
статистика сбрасывается в базу каждые 2 минуты (можно и чаще/реже)

вопрос остается открытым
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Даже не знаю, что Вам посоветовать. При таком подходе, должной производительности добиться будет сложно. Хотя я и не спец в системах сбора статистики, подозреваю, что Вы зашли не с того хода.

Добавлено через 14 минут и 50 секунд
Пообщался немного с коллегами.
В принципе, вариант не совсем мертвый. Но, есть несколько замечаний:

1. Исключить деадлок (убрать usleep).
2. Собрать Memcached с ключом, который гарантирует 100% хранение. Однако, если кончится память - записать в него вы уже ничего не сможете.
3. Собирать статистику по ключам indexXXXXX с использованием increment/decrement.

Такие соображения.

Еще говорят, что в следующем релизе Memcached будут встроенные локи.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
DooZ
Дата 4.3.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



сам с нетерпением жду локов встроеных smile

по пунктам:
1. в моем варианте в цикле, если совсем убрать паузу, нагрузка 100% на мемкеш, пусть и доли секундная, но есть
2. что за ключ? можно поподробнее?
3. а если ключей будет миллионы? что тогда? не умрет сервак?


спасибо за советы, буду пробывать smile
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



1. Просто вы сразу отрезали довольно большую часть запросов. 100 мс, это одна десятая секунды, первый запрос лочит все последующие на 100 мс. Ну и т.п.
2. Гугл и оф. доки в помощь smile
3. Если у вас есть в БД набор ID, т.е. они Вам известны, то не должно ничего случиться. Делаете выборки ID, частями, и пошли считать. Если Memcached упрется в max connections, советую погуглить facebook memcached. 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
DooZ
Дата 4.3.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



сенькс, буду пробывать
тем немения если кто-то сможет дать пример, буду очень благодарен smile
PM MAIL   Вверх
Wowa
Дата 7.3.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(DooZ @  4.3.2009,  17:29 Найти цитируемый пост)
2. что за ключ? можно поподробнее?

ну, идея состоит в том, чтобы сделать избыточное хранение в мемкеше на нескольких серверах.


Цитата(DooZ @  4.3.2009,  17:29 Найти цитируемый пост)
3. а если ключей будет миллионы? что тогда? не умрет сервак?

в мемкеще скорость доступа O(1) независимо от кол-во хрянящихся в нем объектов. В max connections конечно можно упереться, но спасение через multi_request имхо есть.

Добавлено @ 18:29
P.S. Я бы так и делал, т.е. инкерементировал бы значения и иногда скидывал бы их в базу. Можно разбить систему на кластеры - поставить несколько веб-серверов и для каждого свои мемкешы сделать. Тогда масштабируемость же любая.
PM WWW   Вверх
DooZ
Дата 10.3.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: 1
Всего: 1



2Wowa спасибо за идею, буду пробывать smile
PM MAIL   Вверх
Alexm6
Дата 7.9.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 7.9.2009

Репутация: 1
Всего: 1



смотреть стоит в сторону инкремента .
IZ@TOP верно заметил что надо собирать составной ключ ( т.е. изменить структуру хранения массива ),  к примеру 
$cache[$id]['shows']  будет иметь ключ "cache_$id_shows", само поле считать инкрементом ( если нужны счетчики ), так ты отвяжешься от пересчетов данных

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



Это сообщение отредактировал(а) Alexm6 - 7.9.2009, 15:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.