memcached
| Розробник(и) | Danga Interactive |
|---|---|
| Стабільний випуск | 1.4.15 (3 вересня 2012) |
| Операційна система | Незалежне від платформи ПЗ |
| Тип | memcached |
| Ліцензія | BSD |
| Сайт | memcached.org/ |
Memcached — комп'ютерна програма, сервіс кешування даних в оперативній пам'яті на основі парадигми розподіленої хеш-таблиці.
З допомогою клієнтської бібліотеки (для Perl, PHP, Python, Java та ін.) дозволяє кешувати дані в ОЗУ одного або декількох серверів. Розподіл даних реалізується по значенню хеш ключа. Клієнтська бібліотека використовуючи ключ даних визначає його хеш і використовує його для вибору відповідного сервера. Ситуація збою сервера трактується як промах кеша. Це дозволяє, зокрема, проводити гарячу заміну серверів.
В API memcached є тільки базові функції: вибір сервера, установка з'єднання, додання, видалення, оновлення і отримання об'єкта. Для кожного об'єкта встановлюється час устарівання, починаючи з 1 секунди до нескінченності. При переповненні пам'яті старіші об'єкти кеша автоматично знищуються.
Сервер memcached було розроблено для сайта LiveJournal з метою зниження навантаження на сервери баз даних.
Зміст |
Приклад коду [ред.]
Зверніть увагу, що всі функції, описані в цьому розділі, написані на псевдокоді. Синтаксис виклику 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, щоб наступний виклик не знайшов дані в кеші і запросив їх в базі даних. Аналогічні дії потрібні і в разі видалення даних з бази даних, щоб кеш залишався коректним або частково незаповненим.
Примітки [ред.]
Посилання [ред.]
- Сайт проекту
- Сайт розробника
- Distributed Caching with Memcached by Brad Fitzpatrick
- Memcached для windows
