memcached

Поделись знанием:
Перейти к: навигация, поиск

memcached
Тип

memcached

Написана на

C[1]

Операционная система

Кроссплатформенное ПО

Последняя версия

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"

Примечания

  1. [www.infoq.com/news/2008/10/jgroups-memcached InfoQ: JGroups Implementation of Memcached Supports Failover and JMX]
  2. [github.com/memcached/memcached/wiki/ReleaseNotes1431 Memcached 1.4.31 Release Notes]

Ссылки

  • [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… [Нет, Андрей, я говорю: ты так, так переменился…]