Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 25.03.2015 17:21:14

Блокировки кэша

Кто-нибудь сталкивался?
Есть у кого готовые наметки?

Вообще нужно решение для следующего, может кто подскажет.

Клиент отправляет на серв 10 ajax'ов, каждый хочет что то дописать в кэш.
Но т.к. скорость выполнения запроса отличается не сильно, очень часто часть инфы переписывает друг друга.

Посоветуете что нить?
Последовательные запросы не эффективные из-за тупого бэкэнда.
Файловый кэш так же не эффективен из-за большой нагрузки на сервер.

Не в сети

#2 26.03.2015 08:40:08

Re: Блокировки кэша

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

Не в сети

#3 26.03.2015 11:46:49

Re: Блокировки кэша

Структура данных - json
Ну если на пальцах то смысл запросов таков:
есть например несколько товаров, вот по ним я делаю запросы.

products.forEach(function(product){
 writeInfo(product.name,product.val);
});

function writeInfo(pName, pVal){
$.ajax({
 url: 'some.php',
 data: {name:pName, val:pVal},
 success: callback
});
};

, а на серве записываю для каждого запроса.

Session::put('key_'.Input::get('name'), Input::get('val'));

Вот если взять

Session::get('key_name1');

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

Не в сети

#4 26.03.2015 13:23:12

Re: Блокировки кэша

ну вообще это очень неоптимально. по идее some.php должен принимать сразу массив пар name=>value и выполнять групповую операцию на одном обращении. а если нужна атомарность операций — надо использовать базу.

кроме того, так уж получилось, что я прямо сейчас делаю корзину с товарами по своему проекту — я собственно храню все данные в cart_items строками вида id,cart_code,product_id,quantity. при этом cart_code берётся из сессии. Сессия устарела — корзина самоуничтожилась. (на самом деле конечно у меня просто по крону чистится содержимое cart_items для удаления старых корзин). сформировался новый заказ — перенесли данные в orders, а cart_code удалили из сессии — опять новая корзинка.

если делаешь что-то подобное, сессия — идеальное хранилище для короткоживущих данных.

Не в сети

#5 26.03.2015 14:07:35

Re: Блокировки кэша

Ну нет, далеко не подобное, это просто аналогичный пример был.
Вообще вот смысл того, что я хочу конкретная задача:
Выполнить одновременно не более 14 запросов и быстро сохранить полученный результат.
Вот собственно и вопрос куда и как.
Ну куда понятно - в сессию.
А вот как?
file - не катит была такая реализация до сего момента, нагрузка высокая, поэтому ОЧЕНЬ сильно падает производительность именно поиска-чтения-записи.
memcached и redis подходит, но трут свои же записи.
Вот как реализовать хз....
Да и еще...
Можно ли в процессе работы использовать и file и memcached сессию?
Ну т.е. как то динамично менять драйвер?

Изменено sepgg (26.03.2015 14:09:36)

Не в сети

#6 27.03.2015 07:49:12

Re: Блокировки кэша

ещё раз — если нужна атомарность операций — надо хранить данные в базе данных, использовать таблицы, связи, транзакции и блокировки (в eloquent — PHPlockForUpdate() на выборке внутри транзакции). все остальные методы не обеспечат требуемых условий. даже если хранить сессии в базе — всё равно сессия сериализуется в неё целиком, то есть кто последний сохранил в неё данные — те данные и будут в ней присутствовать. если же переписать драйвер database сессии так чтобы он блокировал сессию в транзакции — получится то же самое последовательное выполнение запросов, от которого ты хочешь уйти.

Не в сети

Подвал раздела