Перейти к основному содержимому

Первые шаги с Memcached

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Как читать эту страницу. Сначала поднимите демон (Linux или Docker), затем поиграйте с командами в терминале ниже или через telnet/nc. Заголовки вроде "база данных" и "VIEW" здесь намеренно SQL-образные — чтобы сравнить с PostgreSQL и сразу увидеть, чего в Memcached нет. Теория cache-aside и slab — в основной главе; все команды и флаги — в справочнике.


Установка

Нужны два уровня:

  1. Сервер — процесс memcached, слушает порт 11211.
  2. Клиент — ваша программа или консоль (telnet, nc, библиотека pymemcache и т.д.).

Схем, таблиц и CREATE DATABASE нет — только пары ключ → байты в RAM.

Play ITЗагрузка интерактивного демо…

Попробуйте в демо: set page:home 0 300 5 helloget page:homestats.


Что понадобится

  • 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 / UPDATEset, add, replace
SELECTget (по точному ключу)
DELETEdelete
Индекс по полюНет

Ключи должны быть уникальны в кластере (если несколько узлов — клиент сам выбирает узел по хешу ключа).

При рестарте демона или сервера всё содержимое 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
0flagsМетка для приложения (сжато? JSON?) — сервер не интерпретирует
3600exptimeTTL в секундах (здесь 1 час)
11bytesДлина следующей строки тела — ровно 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

Что дальше

  1. Прочитайте Memcached — кэширование в RAM — cache-aside, кластер, Redis vs Memcached, безопасность порта 11211.
  2. Держите под рукой справочник при настройке -m, -l, SASL.
  3. В коде подключите pymemcache / EnyimMemcached и всегда обрабатывайте промах и недоступность кэша как штатные случаи.

В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первые шаги с Cassandra, Первые шаги к микросервисам, Первые шаги с Redis, Первые шаги с Docker и Kubernetes, Первые шаги с MongoDB, Первые шаги с SQL.