memcached
Тип |
memcached |
---|---|
Написана на | |
Операционная система | |
Последняя версия |
1.4.31 (19 августа 2016) [2] |
memcached — программное обеспечение, реализующее сервис кэширования данных в оперативной памяти на основе хеш-таблицы.
С помощью клиентской библиотеки (для C/C++, Ruby, Perl, PHP, Python, Java, .Net и др.) позволяет кэшировать данные в оперативной памяти множества доступных серверов. Распределение реализуется путём сегментирования данных по значению хэша ключа по аналогии с сокетами хэш-таблицы. Клиентская библиотека, используя ключ данных, вычисляет хэш и использует его для выбора соответствующего сервера. Ситуация сбоя сервера трактуется как промах кэша, что позволяет повышать отказоустойчивость комплекса за счет наращивания количества memcached серверов и возможности производить их горячую замену.
В API memcached есть только базовые функции: выбор сервера, установка и разрыв соединения, добавление, удаление, обновление и получение объекта, а также Compare-and-swap. Для каждого объекта устанавливается время жизни, от 1 секунды до бесконечности. При исчерпании памяти более старые объекты автоматически удаляются. Для PHP также есть уже готовые библиотеки PECL для работы с memcached, которые дают дополнительную функциональность.
По умолчанию memcached использует порт 11211.
Пример кода
Обратите внимание, что все функции, описанные в этом разделе, написаны на псевдокоде. Синтаксис вызова Memcached может отличаться в зависимости от используемого языка программирования и используемого API.
Запрос к базе данных (без использования memcached) может выглядеть как в следующем примере:
function get_foo(int userid) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
return result;
}
После введения использования memcached, этот же вызов может выглядеть следующим образом (здесь и далее используется псевдокод, синтаксис вызова memcached может отличаться):
function get_foo(int userid) {
/* вначале проверить кэш */
data = memcached_fetch("userrow:" + userid);
if (!data) {
/* не найдено: запросить БД */
data = db_select("SELECT * FROM users WHERE userid = ?", userid);
/* сохранить в кэше для будущих запросов */
memcached_add("userrow:" + userid, data);
}
return data;
}
Сервер вначале проверит, хранит ли Memcached значение с уникальным ключом «userrow: userid», где userid является некоторым числом. Если кэш не содержит такие данные, сервер сделает запрос к БД, как обычно, и установит уникальный ключ, используя вызов к memcached API.
Однако, если использовать только этот вызов к API, сервер может вернуть некорректные данные после любого обновления БД: Memcached будет хранить и возвращать устаревшие данные. Поэтому, в дополнение к вызову на занесение данных в кэш, также необходимо и обновление:
function update_foo(int userid, string dbUpdateString) {
/* вначале обновить БД */
result = db_execute(dbUpdateString);
if (result) {
/* обновление БД состоялось: подготовить данные для занесения в кэш*/
data = db_select("SELECT * FROM users WHERE userid = ?", userid);
/* последняя строка также могла выглядеть наподобие data = createDataFromDBString(dbUpdateString); */
/* занести обновленные данные в кэш */
memcached_set("userrow:" + userid, data);
}
}
Этот вызов обновит кэшированные данные, чтобы они соответствовали новым данным в базе данных, только если запрос на обновление базы закончится успехом. Другой подход может заключаться в том, чтобы очистить кэш по данному ключу с помощью функции Memcached, чтобы последующий вызов не нашел данные в кэше и запросил их в базе данных. Аналогичные действия нужны и в случае удаления данных из базы данных, чтобы кэш оставался корректным либо частично незаполненным.
Напишите отзыв о статье "Memcached"
Примечания
Ссылки
- [memcached.org/ Сайт проекта]
- [www.danga.com Сайт разработчика]
- [www.linuxjournal.com/article/7451 Distributed Caching with Memcached by Brad Fitzpatrick]
В данной статье или разделе имеется список источников или внешних ссылок, но источники отдельных утверждений остаются неясными из-за отсутствия сносок. Утверждения, не подкреплённые источниками, могут быть поставлены под сомнение и удалены. Вы можете улучшить статью, внеся более точные указания на источники.
|
Отрывок, характеризующий Memcached
Князь Андрей только пожал плечами на детские речи Пьера. Он сделал вид, что на такие глупости нельзя отвечать; но действительно на этот наивный вопрос трудно было ответить что нибудь другое, чем то, что ответил князь Андрей.– Ежели бы все воевали только по своим убеждениям, войны бы не было, – сказал он.
– Это то и было бы прекрасно, – сказал Пьер.
Князь Андрей усмехнулся.
– Очень может быть, что это было бы прекрасно, но этого никогда не будет…
– Ну, для чего вы идете на войну? – спросил Пьер.
– Для чего? я не знаю. Так надо. Кроме того я иду… – Oн остановился. – Я иду потому, что эта жизнь, которую я веду здесь, эта жизнь – не по мне!
В соседней комнате зашумело женское платье. Как будто очнувшись, князь Андрей встряхнулся, и лицо его приняло то же выражение, какое оно имело в гостиной Анны Павловны. Пьер спустил ноги с дивана. Вошла княгиня. Она была уже в другом, домашнем, но столь же элегантном и свежем платье. Князь Андрей встал, учтиво подвигая ей кресло.
– Отчего, я часто думаю, – заговорила она, как всегда, по французски, поспешно и хлопотливо усаживаясь в кресло, – отчего Анет не вышла замуж? Как вы все глупы, messurs, что на ней не женились. Вы меня извините, но вы ничего не понимаете в женщинах толку. Какой вы спорщик, мсье Пьер.
– Я и с мужем вашим всё спорю; не понимаю, зачем он хочет итти на войну, – сказал Пьер, без всякого стеснения (столь обыкновенного в отношениях молодого мужчины к молодой женщине) обращаясь к княгине.
Княгиня встрепенулась. Видимо, слова Пьера затронули ее за живое.
– Ах, вот я то же говорю! – сказала она. – Я не понимаю, решительно не понимаю, отчего мужчины не могут жить без войны? Отчего мы, женщины, ничего не хотим, ничего нам не нужно? Ну, вот вы будьте судьею. Я ему всё говорю: здесь он адъютант у дяди, самое блестящее положение. Все его так знают, так ценят. На днях у Апраксиных я слышала, как одна дама спрашивает: «c'est ca le fameux prince Andre?» Ma parole d'honneur! [Это знаменитый князь Андрей? Честное слово!] – Она засмеялась. – Он так везде принят. Он очень легко может быть и флигель адъютантом. Вы знаете, государь очень милостиво говорил с ним. Мы с Анет говорили, это очень легко было бы устроить. Как вы думаете?
Пьер посмотрел на князя Андрея и, заметив, что разговор этот не нравился его другу, ничего не отвечал.
– Когда вы едете? – спросил он.
– Ah! ne me parlez pas de ce depart, ne m'en parlez pas. Je ne veux pas en entendre parler, [Ах, не говорите мне про этот отъезд! Я не хочу про него слышать,] – заговорила княгиня таким капризно игривым тоном, каким она говорила с Ипполитом в гостиной, и который так, очевидно, не шел к семейному кружку, где Пьер был как бы членом. – Сегодня, когда я подумала, что надо прервать все эти дорогие отношения… И потом, ты знаешь, Andre? – Она значительно мигнула мужу. – J'ai peur, j'ai peur! [Мне страшно, мне страшно!] – прошептала она, содрогаясь спиною.
Муж посмотрел на нее с таким видом, как будто он был удивлен, заметив, что кто то еще, кроме его и Пьера, находился в комнате; и он с холодною учтивостью вопросительно обратился к жене:
– Чего ты боишься, Лиза? Я не могу понять, – сказал он.
– Вот как все мужчины эгоисты; все, все эгоисты! Сам из за своих прихотей, Бог знает зачем, бросает меня, запирает в деревню одну.
– С отцом и сестрой, не забудь, – тихо сказал князь Андрей.
– Всё равно одна, без моих друзей… И хочет, чтобы я не боялась.
Тон ее уже был ворчливый, губка поднялась, придавая лицу не радостное, а зверское, беличье выраженье. Она замолчала, как будто находя неприличным говорить при Пьере про свою беременность, тогда как в этом и состояла сущность дела.
– Всё таки я не понял, de quoi vous avez peur, [Чего ты боишься,] – медлительно проговорил князь Андрей, не спуская глаз с жены.
Княгиня покраснела и отчаянно взмахнула руками.
– Non, Andre, je dis que vous avez tellement, tellement change… [Нет, Андрей, я говорю: ты так, так переменился…]