Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Кеширование данных
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Кеширование данных

Страниц (2): [1] 2 »
 

1. PlayTime - 22 Сентября, 2013 - 14:41:48 - перейти к сообщению
Здравствуйте,
Стоит задача проверки IP пользователя на уникальность за текущие сутки. Самый простым способом есть хранение данных в таблицы MySQL и выборка данных с нее. Но нашел я такой тип таблиц как MEMORY таблицы. И это было то что мне нужно. Таблицу я сделал самой простой, один столбец в котором был IP преобразованный при помощи INET_ATON().
Скорость проверки наличия адреса в этой таблице была ровно в два раза больше чем в аналогичной таблице при использовании MyISAM. А размер со 100 000 тысячами записей всего 2мб. И все казалось хорошо, но была прочитана мной одна особенность. Данные могут попасть в СВОП что в данном случае сыграет против меня.
Думал попробовать хранить данные при помощи memcached но там тоже оказались минусы. В случае нехватки выделенной памяти старые данные будут удалены что никак не позволительно в данной ситуации так как список IP мне нужен за последние 24 часа. Есть ли какой то способ сделать так чтобы данные гарантировано находились в ОЗУ и к ним был быстрый доступ но в тоже время они никуда не пропадали в случае если память закончилась. (можно выделить для memcached много памяти, но это все равно не гарантирует сохранность данных).
Или может у меня не правильный подход к этому?
2. EuGen - 22 Сентября, 2013 - 15:32:22 - перейти к сообщению
Вы сами уже ответили на свой вопрос:
PlayTime пишет:
Данные могут попасть в СВОП что в данном случае сыграет против меня.

или
PlayTime пишет:
В случае нехватки выделенной памяти старые данные будут удалены

- собственно, два подхода к решению ситуации с нехваткой памяти. Резюмируя: Вы никак не можете хранить данные в некотором хранилище (в данном случае - ОЗУ), если их размер превосходит размер хранилища.
3. PlayTime - 22 Сентября, 2013 - 18:30:41 - перейти к сообщению
EuGen пишет:
Вы никак не можете хранить данные в некотором хранилище (в данном случае - ОЗУ), если их размер превосходит размер хранилища.


Это понятно. Но выше я привел размер таблицы со 100 000 тысячами записей в MYSQL. Их размер по сравнению с общим количеством ОЗУ очень мал.
Опишу как я понял работу memcached: выделено место (например 250мб) и кеш их будет занимать потихоньку, со временем когда кеш будет заполнен он начнет удалять старые данные.
Мне было бы удобно выделить 20Мб памяти под таблицу и чтобы они все время были зарезервированы для нее. Благо 20 Мб памяти это совсем не много. Но чтобы ни при каких обстоятельствах они не попали в СВОП. Или все равно, если для других процессов не будет хватать памяти то они этот контейнер размером 20Мб вытеснят в СВОП? Хотя он активно используется (данные с контейнера).
4. caballero - 22 Сентября, 2013 - 19:29:22 - перейти к сообщению
полагаю мемкеш не работает с ОЗУ напрямую
посему в своп запросто может попасть

но наиболее часто используемые данные все таки будут в физическом ОЗУ.
А нечасто используемым в мемкеше делать нечего
5. Мелкий - 22 Сентября, 2013 - 20:48:20 - перейти к сообщению
Я бы выразился более категорично - если ваш сервер полез в своп - всё остальное бесполезно, это уже упавший сервис (именно сервис, сервер ещё может иногда отвечать, когда просвопится).

А под задачу:
PlayTime пишет:
Хранение данных в ОЗУ пока они не будут целенаправленно удалены

Ни memory ни memcache не подходят по условию. Рестарт машины - и данных нет.
Смотрите в сторону redis, mongoDB, postgresql.
6. PlayTime - 22 Сентября, 2013 - 22:10:19 - перейти к сообщению
caballero
Мемкеш я не могу использовать потому что он не дает гарантии сохранения данных. В то время как MySQL будет их хранить до перезагрузки сервера или удаления запросами.
Мелкий,
Спасибо.
Я не гуру в администрировании и не знал что "хорошие" сервера своп не используют (хотя у себя на 3 серверах я ни разу не видел использования свопа). Но думал что это штатная ситуация.
О том что данные после рестарта пропадут мне известно.
Но в данный момент меня это не сильно беспокоит (Сервер MySQL работает 88 дней, 11 часов, 0 минут и 19 секунд.).
Я сравнил операцию вставки в таблицу MyISAM и операцию выборки. Вставка была равна 8Е-5 в то время как выборки с этой же таблицы 0.025460679789652 (это MyISAM).
По этому я решил так - данные одновременно будут записываться в две таблицы. На диск и в память.
В случае рестарта сервера запуск MYSQL будет происходить через скрипт который сначала запустит MySQL а потом скопирует в MEMORY таблицу данные с той таблицы которая на диске.

Как я понял. Сервер не должен использовать СВОП. И если он это сделает то просто нужно добавить памяти. То есть я могу не переживать о том что данные MySQL попадут в файл подкачки.
7. Squirrel - 22 Сентября, 2013 - 23:25:45 - перейти к сообщению
PlayTime Фигней ты страдаешь. Лучше озаботься правильной настройкой дискового кэша.
8. PlayTime - 23 Сентября, 2013 - 12:18:08 - перейти к сообщению
Squirrel пишет:
Лучше озаботься правильной настройкой дискового кэша.

Зачем в решении данной задачи использовать дисковый кеш если таблицы и так на диске могут быть?
9. Squirrel - 23 Сентября, 2013 - 14:51:23 - перейти к сообщению
PlayTime Читай внимательней. И чутка матчасть подучи, тогда ответ станет очевидным. Судя по твоему вопросу, становится очевидным, что с матчастью ты не знаком вообще.
10. caballero - 23 Сентября, 2013 - 14:56:02 - перейти к сообщению
Цитата:
Зачем в решении данной задачи использовать дисковый кеш если таблицы и так на диске могут быть?

потому и надо.
Сервер БД сам закеширует в памяти часто используемые данные.
11. PlayTime - 23 Сентября, 2013 - 15:52:56 - перейти к сообщению
caballero пишет:
потому и надо.
Сервер БД сам закеширует в памяти часто используемые данные.


Я не очень корректно написал название темы, но описание корректное.
Я с вами согласен но вы не до конца поняли именно эту задачу.
MySQL кеширует данные. Но если таблица была изменена то данные уже не будут браться с кеша а опять сделают выборку с диска.
Таблица состоит из строк в котором один столбец типа INT(4). (если использовать MYSQL).
Выборка почти никогда не попадет в кеш так как данные часто изменяются, по этой причине даже отключено кеширование данного MySQL запроса.
По этому нужно хранилище к которому есть быстрый доступ но запросы к нему не будут помещены в кеш а данные удалены пока сервер не будет перезагружен или не будет произведен запрос на удаление.
12. LIME - 23 Сентября, 2013 - 16:07:43 - перейти к сообщению
будем дальше гадать))
скролл на пункт 16[dot] Вертикальное разделение
13. PlayTime - 23 Сентября, 2013 - 16:12:23 - перейти к сообщению
LIME пишет:
будем дальше гадать))

Почему гадать? Я мало данных привел или плохо описал то что нужно?
У меня только один столбец, не связан больше ни с какой таблицей.
14. Squirrel - 23 Сентября, 2013 - 17:53:39 - перейти к сообщению
PlayTime пишет:
Выборка почти никогда не попадет в кеш так как данные часто изменяются, по этой причине даже отключено кеширование данного MySQL запроса.

Мда? Вот потому, что ты такой бред пишешь, тебя и отправляют учить мат часть.
Прежде чем выборка будет произведена, сначала ОС загрузит все данные в дисковый кэшь, если их там нет. А запрошены с диска будут только те данные, которых нет в кэше самого сервера. Прежде всего, стоит помнить, что БД MySQL, это всего лишь обычный файл.
Если не путаю, то MySQL имеет собственные кеши для хранения данных, (а не только запросов!), а уж ОС будет кешировать их обязательно. По этому рациональнее отдать память под ДИНАМИЧЕСКОЕ хранилище, которыми по факту и являются кеши. Очень редкие задачи требуют RAM дисков, и твоя, не из их числа. Кста, память занимаемая RAM диском в своп не вытесняется. Если писатель не рукожоп конечно, или специально не предусмотрел такой возможности.

PlayTime пишет:
Но если таблица была изменена то данные уже не будут браться с кеша а опять сделают выборку с диска.

Да нифига подобного. Данные останутся в КЭШе, читай в памяти, и только в случае длительного простая, и при условии нехватки памяти другим задачам, твои данные будут удалены из кэша физически.
И еще одно. Если данные попали в своп, это еще не означает, что они физически удалены их памяти. Данные могу находится одновременно и в свопе на диске, и кеше. И только при нехватке ресурсов они будут удалены из ОЗУ физически.

PlayTime пишет:
Я не гуру в администрировании и не знал что "хорошие" сервера своп не используют
Гуру об этом то же не знают, так что не переживай.
15. PlayTime - 23 Сентября, 2013 - 19:57:00 - перейти к сообщению
Squirrel пишет:
Мда? Вот потому, что ты такой бред пишешь, тебя и отправляют учить мат часть.


Ты это имеешь в виду?
Цитата:
Страничный кэш в системе Linux ("Cached:" в meminfo) является в большинстве систем самым крупным потребителем памяти. Каждый раз, когда вы выполняете операцию чтения read () из файла, расположенного на диске, данные считываются в память и помещаются в страничный кэш....


Squirrel пишет:
Да нифига подобного. Данные останутся в КЭШе, читай в памяти, и только в случае длительного простая, и при условии нехватки памяти другим задачам, твои данные будут удалены из кэша физически.

В дисковом кеше останутся? Я имел ввиду кеш MySQL.

Цитата:
Кроме результатов, MySQL хранит в кеше список таблиц, выборка из которых закеширована. Если в любой из таблиц, выборка из которой есть в кеше, проиcходят изменения (вставка или изменение строк), то MySQL удаляет из кеша такие выборки. Такой подход ускоряет работу MySQL, но может быть неэффективным для систем с большим количеством запросов на изменение таблиц.


Я не отрицаю того что есть то чего я не знаю.
Но я сравнил один и тот же запрос к таблице типа MyISAM и MEMORY без использование кеширования MySQL. С таблицы типа MEMORY выборка была сделана в два раза быстрее. Проходов было сделано 2000 на каждый тип таблицы.
Я понял что данные с файла будут помещены в дисковый кеш и если к ним будет частое обращение то они там будут долго. Наверно это связано с самим механизмом работы с таблицами MyISAM и MEMORY.

 

Powered by ExBB FM 1.0 RC1