Блокировки в memcache

Рейтинг: 0Ответов: 1Опубликовано: 22.02.2015

Добрый день.

Есть кеш с пользователями и сообщениями для них, например:

 User_1['{'from':'User_55','data':'Привет'}']

Когда User_55 пишет сообщение для User_1, то записываем в кеш для User_1, а пользователь User_1 периодически проверяет кеш, и если там что-то новое, то работаем с этим и очищаем кеш. Но... если много человек начнут слать сообщения к одному человеку, надо как-то блокировать memcache.

Для файла делаю подобное с flock:

while ((time() - $time) < 30) {
            if ($data = file_get_contents('sockets/'.$sock)) {
                $f = fopen('sockets/'.$sock, 'r+b') or die('socket not found');
                flock($f, LOCK_EX);
                ftruncate($f, 0);
                fwrite($f, '');
                fclose($f);
                $data = trim($data, "\r\n");
                foreach (explode("\r\n", $data) as $action) {
                    self::$actions[] = $action;
                }
                self::Send();
            }
            sleep(1);
        }

А как быть с кешем? Можете подсказать конкретный пример?

Спасибо.

Ответы

▲ 1

memcache не предназначен для конкурирующих запросов, единственное, что там есть, - это атомарные операции инкремента/декремента.

У вас ошибка в архитектуре, в данном случае нужно или переходить на key-value хранилище, которое обеспечивает работу с конкурирующими запросами, или организовать очередь.