Первые шаги с Memcached
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Как читать эту страницу. Сначала поднимите демон (Linux или Docker), затем поиграйте с командами в терминале ниже или через
telnet/nc. Заголовки вроде "база данных" и "VIEW" здесь намеренно SQL-образные — чтобы сравнить с PostgreSQL и сразу увидеть, чего в Memcached нет. Теория cache-aside и slab — в основной главе; все команды и флаги — в справочнике.
Установка
Нужны два уровня:
- Сервер — процесс
memcached, слушает порт 11211. - Клиент — ваша программа или консоль (
telnet,nc, библиотекаpymemcacheи т.д.).
Схем, таблиц и CREATE DATABASE нет — только пары ключ → байты в RAM.
Play ITЗагрузка интерактивного демо…
Попробуйте в демо: set page:home 0 300 5 hello → get page:home → stats.
Что понадобится
- Linux, macOS или Windows (ниже — Docker, он одинаков на всех ОС).
- Права установить пакет или запустить контейнер.
- ~512 МБ RAM на машине для учебного инстанса (в prod под кэш выделяют гигабайты отдельно).
Вариант A — Ubuntu / Debian
sudo apt update
sudo apt install memcached libmemcached-tools # tools: memcat, memflush и др.
sudo systemctl enable --now memcached
sudo systemctl status memcached # active (running)
Проверка порта:
# классика — интерактивно, выход — Ctrl+] затем quit
telnet localhost 11211
# или однострочник (GNU nc на Linux)
printf "version\r\nquit\r\n" | nc -q 1 localhost 11211
Вариант B — Docker (удобно на Windows)
docker run --name learn-memcached -d -p 11211:11211 memcached:latest
docker exec -it learn-memcached sh
memcached -v # версия демона внутри образа
С хоста порт 11211 проброшен — те же команды telnet localhost 11211.
"База данных" — зачем такой заголовок
В PostgreSQL вы делаете CREATE DATABASE. В Memcached ничего создавать не нужно — один глобальный плоский namespace, уникальность только по строке ключа (user:42, session:abc).
| В SQL | В Memcached |
|---|---|
| База, схема, таблица | Нет — только ключ |
INSERT / UPDATE | set, add, replace |
SELECT | get (по точному ключу) |
DELETE | delete |
| Индекс по полю | Нет |
Ключи должны быть уникальны в кластере (если несколько узлов — клиент сам выбирает узел по хешу ключа).
При рестарте демона или сервера всё содержимое RAM пропадает — это норма, не баг. Источник истины остаётся в вашей БД.
Сторонние GUI (PHP-Memcached-GUI и др.) существуют, но в проде и на экзаменах чаще ожидают знание текстового протокола.
Первая запись — команда set
Значение для сервера — произвольные байты. JSON, MessagePack, картинка — вы сериализуете сами; Memcached хранит blob.
Команда set — две строки: заголовок и тело.
set key_name 0 3600 11
Hello World
Разбор строки заголовка set key_name 0 3600 11:
| Поле | Значение | Смысл |
|---|---|---|
key_name | имя | До 250 байт, без пробелов и \r\n |
0 | flags | Метка для приложения (сжато? JSON?) — сервер не интерпретирует |
3600 | exptime | TTL в секундах (здесь 1 час) |
11 | bytes | Длина следующей строки тела — ровно 11 символов в Hello World |
Ответ сервера: STORED или ошибка (CLIENT_ERROR …).
JSON в значении
set employee:1001 0 86400 45
{"first_name":"Ivan","last_name":"Ivanov","salary":75000}
Префиксы (employee:, user:, session:) помогают группировать ключи в голове и в логах; сервер префиксы как сущность не знает.
Ограничения и память (вместо "индексов")
Нет FOREIGN KEY, CHECK, индексов по полям — только скорость get/set по полному ключу.
Уникальность: один ключ — одно значение; повторный set перезаписывает старое.
Память: при заполнении -m срабатывает LRU внутри slab-классов (подробнее). Политик LFU/ARC в самом Memcached нет (в Redis — другая история).
CRUD в четырех командах
Create — set и add
set user:online_status 0 60 4
true
add — только если ключа ещё нет (иначе NOT_STORED):
add user:temp_data 0 3600 10
Value here
Сессия целиком в одном ключе:
set session:abc123 0 3600 50
{"user_id":100,"role":"admin"}
Read — get
Один ключ:
get user:online_status
Несколько за один round-trip (меньше сетевых задержек):
get user:online_status session:abc123
Список всех ключей сервер не выдаёт. Для диагностики — stats, stats slabs (см. справочник). stats cachedump в старых версиях показывал ключи; сейчас обычно отключён.
Update — set, incr, decr
set user:online_status 0 60 5
false
Счётчик: сначала положите число строкой, потом incr:
set counter:page_views 0 0 1
0
incr counter:page_views 1
decr не уходит ниже нуля.
Delete
delete user:1001
Очистить весь кэш (только dev/stage!):
flush_all
flush_all 60
Вторая форма — отложенная очистка через 60 секунд.
"Представления" и JOIN — только в приложении
VIEW и JOIN в Memcached не существуют. "Список активных пользователей" — это ваш код, который знает набор ключей (из БД, конфига или отдельного индекса в Redis) и делает несколько get:
import json
active_users = []
for key in ("user:1", "user:2", "user:3"):
raw = client.get(key) # pymemcache
if raw and json.loads(raw).get("status") == "active":
active_users.append(json.loads(raw))
Pub/Sub, триггеры, хранимые процедуры — тоже нет. События — RabbitMQ, Kafka, Redis Pub/Sub.
Проверка "зарплата ≥ 0" — до set:
import json
salary = get_salary_from_input()
if salary < 0:
raise ValueError("Salary cannot be negative")
client.set(f"employee:{emp_id}", json.dumps({"salary": salary}), expire=3600) # pymemcache
Что дальше
- Прочитайте Memcached — кэширование в RAM — cache-aside, кластер, Redis vs Memcached, безопасность порта 11211.
- Держите под рукой справочник при настройке
-m,-l, SASL. - В коде подключите
pymemcache/ EnyimMemcached и всегда обрабатывайте промах и недоступность кэша как штатные случаи.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первые шаги с Cassandra, Первые шаги к микросервисам, Первые шаги с Redis, Первые шаги с Docker и Kubernetes, Первые шаги с MongoDB, Первые шаги с SQL.