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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Кеширование данных

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Хранение данных в ОЗУ пока они не будут целенаправленно удалены
PlayTime
Отправлено: 22 Сентября, 2013 - 14:41:48
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




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


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Вы сами уже ответили на свой вопрос:
PlayTime пишет:
Данные могут попасть в СВОП что в данном случае сыграет против меня.

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

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
PlayTime
Отправлено: 22 Сентября, 2013 - 18:30:41
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




EuGen пишет:
Вы никак не можете хранить данные в некотором хранилище (в данном случае - ОЗУ), если их размер превосходит размер хранилища.


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

(Отредактировано автором: 22 Сентября, 2013 - 18:42:02)

 
 Top
caballero
Отправлено: 22 Сентября, 2013 - 19:29:22
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




полагаю мемкеш не работает с ОЗУ напрямую
посему в своп запросто может попасть

но наиболее часто используемые данные все таки будут в физическом ОЗУ.
А нечасто используемым в мемкеше делать нечего


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 22 Сентября, 2013 - 20:48:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Я бы выразился более категорично - если ваш сервер полез в своп - всё остальное бесполезно, это уже упавший сервис (именно сервис, сервер ещё может иногда отвечать, когда просвопится).

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

Ни memory ни memcache не подходят по условию. Рестарт машины - и данных нет.
Смотрите в сторону redis, mongoDB, postgresql.


-----
PostgreSQL DBA
 
 Top
PlayTime
Отправлено: 22 Сентября, 2013 - 22:10:19
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




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

Как я понял. Сервер не должен использовать СВОП. И если он это сделает то просто нужно добавить памяти. То есть я могу не переживать о том что данные MySQL попадут в файл подкачки.

(Отредактировано автором: 22 Сентября, 2013 - 22:21:34)

 
 Top
Squirrel
Отправлено: 22 Сентября, 2013 - 23:25:45
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


PlayTime Фигней ты страдаешь. Лучше озаботься правильной настройкой дискового кэша.
 
 Top
PlayTime
Отправлено: 23 Сентября, 2013 - 12:18:08
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Squirrel пишет:
Лучше озаботься правильной настройкой дискового кэша.

Зачем в решении данной задачи использовать дисковый кеш если таблицы и так на диске могут быть?
 
 Top
Squirrel
Отправлено: 23 Сентября, 2013 - 14:51:23
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


PlayTime Читай внимательней. И чутка матчасть подучи, тогда ответ станет очевидным. Судя по твоему вопросу, становится очевидным, что с матчастью ты не знаком вообще.
 
 Top
caballero
Отправлено: 23 Сентября, 2013 - 14:56:02
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Зачем в решении данной задачи использовать дисковый кеш если таблицы и так на диске могут быть?

потому и надо.
Сервер БД сам закеширует в памяти часто используемые данные.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
PlayTime
Отправлено: 23 Сентября, 2013 - 15:52:56
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




caballero пишет:
потому и надо.
Сервер БД сам закеширует в памяти часто используемые данные.


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


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




будем дальше гадать))
скролл на пункт 16[dot] Вертикальное разделение
 
 Top
PlayTime
Отправлено: 23 Сентября, 2013 - 16:12:23
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




LIME пишет:
будем дальше гадать))

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

(Отредактировано автором: 23 Сентября, 2013 - 16:15:04)

 
 Top
Squirrel
Отправлено: 23 Сентября, 2013 - 17:53:39
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


PlayTime пишет:
Выборка почти никогда не попадет в кеш так как данные часто изменяются, по этой причине даже отключено кеширование данного MySQL запроса.

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

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

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

PlayTime пишет:
Я не гуру в администрировании и не знал что "хорошие" сервера своп не используют
Гуру об этом то же не знают, так что не переживай.

(Отредактировано автором: 23 Сентября, 2013 - 18:14:16)

 
 Top
PlayTime
Отправлено: 23 Сентября, 2013 - 19:57:00
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Squirrel пишет:
Мда? Вот потому, что ты такой бред пишешь, тебя и отправляют учить мат часть.


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


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

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

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


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

(Отредактировано автором: 23 Сентября, 2013 - 20:02:55)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB