Memcached
| Memcached | |
|---|---|
| Тип | кэш |
| Разработчик | Danga Interactive[вд] |
| Написана на | Си[2][3] |
| Операционная система | кроссплатформенность |
| Дата выпуска | 22 мая 2003 |
| Последняя версия | |
| Репозиторий | github.com/memcached/mem… |
| Лицензия | модифицированная лицензия BSD[4] |
| Сайт | memcached.org (англ.) |
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, чтобы последующий вызов не нашел данные в кэше и запросил их в базе данных. Аналогичные действия нужны и в случае удаления данных из базы данных, чтобы кэш оставался корректным либо частично незаполненным.
Примечания
Ссылки
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.