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

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

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

Установка системы Memcached

Процесс установки требует наличия серверного компонента (daemon) и клиентских утилит. В отличие от баз данных, Memcached не хранит метаданные о схемах или структурах.

Требования к системе

  • Операционная система: Linux (Debian/Ubuntu/CentOS), macOS или Windows.
  • Права администратора на машине.
  • Минимум 512 МБ оперативной памяти (рекомендуется выделение под кэш).
  • Доступ к интернету для загрузки пакетов.

Алгоритм установки

Вариант А: Установка на Linux (на примере Ubuntu/Debian)

Откройте терминал и выполните следующие команды:

sudo apt update
sudo apt install memcached libmemcached-tools

После завершения установки проверьте статус службы:

sudo systemctl status memcached

Для входа в интерактивную оболочку используйте команду telnet или nc:

telnet localhost 11211

Примечание: Если telnet не установлен, используйте nc:

nc localhost 11211

Вариант Б: Использование Docker (универсальный способ)

Создание контейнера позволяет изолировать среду разработки:

docker run --name my-memcached \
-d \
-p 11211:11211 \
memcached:latest

Подключение к контейнеру выполняется командой:

docker exec -it my-memcached sh
memcached -v
# Для подключения к консоли:
nc localhost 11211

Создание базы данных

В Memcached отсутствует понятие «база данных» или «коллекция». Все данные хранятся в едином общем пространстве имен, разделенном только уникальными ключами. Нет необходимости создавать пространство перед началом работы.

Принцип работы пространства имен

Сервер Memcached обрабатывает все входящие запросы как операции над глобальным хеш-таблицей. Ключи должны быть уникальными в пределах всего кластера.


Графический способ (Memcached GUI)

Существуют сторонние веб-интерфейсы (например, PHP-Memcached-GUI), которые позволяют визуализировать ключи и их значения. Однако стандартный инструмент — это текстовый протокол.

Важно помнить, что Memcached не имеет механизмов персистентности. При остановке сервиса или перезагрузке сервера все данные исчезают.


Создание структур данных и вставка элементов

Memcached поддерживает только один тип структуры данных — строку (String). Любые сложные объекты (JSON, списки, массивы) должны быть сериализованы в строку перед сохранением.

Синтаксис вставки строки

Команда set создает или обновляет значение.

set key_name 0 3600 11
Hello World

Разбор параметров:

  • key_name: Уникальный идентификатор (максимум 250 байт).
  • 0: Флаги (обычно 0, иногда используются битовые маски для специфичных типов).
  • 3600: Время жизни (TTL) в секундах (1 час). После этого времени ключ удалится автоматически.
  • 11: Длина значения в байтах (длина строки "Hello World").
  • Тело сообщения: Само значение, за которым следует пустая строка (перевод строки).

Синтаксис вставки JSON-объекта

Сериализация объекта сотрудника в строку перед сохранением:

set employee:1001 0 86400 45
{"first_name":"Ivan","last_name":"Ivanov","salary":75000}

Анализ компонентов определения

  • Ключ: Текстовая строка. Рекомендуется использовать префиксы для группировки (например, employee:, user:, session:).
  • Значение: Произвольная строка. Не может превышать размер, указанный в конфигурации сервера (по умолчанию часто 1 МБ).
  • Тайм-аут (TTL): Обязательный параметр. Если установить 0, значение будет храниться вечно, пока не закончится память.
  • Флаги: Целое число, используемое приложением для кодирования типа данных (не используется самим сервером для логики).

Добавление ограничений и индексов

Memcached не поддерживает ограничения целостности, индексы, внешние ключи или валидацию схем. Архитектура системы построена на максимальной скорости доступа, что исключает дополнительные проверки.

Обеспечение уникальности

Уникальность обеспечивается самим механизмом ключей. При попытке сохранить значение с уже существующим ключом старое значение перезаписывается новым.


Сценарии управления памятью

Вместо индексов Memcached использует алгоритмы вытеснения данных при заполнении памяти:

  • LRU (Least Recently Used): Удаляет данные, которые использовались реже всего.
  • LFU (Least Frequently Used): Удаляет данные, которые использовались реже всего.
  • ARC (Adaptive Replacement Cache): Гибридный алгоритм.

Администрирование осуществляется через изменение лимита памяти сервера.


Выполнение CRUD операций

CRUD в Memcached реализуется через простейшие команды протокола.

Создание записей (Create)

Вставка новой строки:

set user:online_status true 0 60

Вставка сложного объекта с TTL:

set session:abc123 0 3600 50
{"user_id":100,"role":"admin"}

Проверка существования ключа перед вставкой (условная запись):

add user:temp_data 0 3600 10
Value here

Примечание: Команда add сработает только если ключ не существует. Если ключ есть, вернется ошибка NOT_STORED.


Чтение данных (Read)

Выборка строки:

get user:online_status

Выборка нескольких ключей за один запрос (оптимизация сети):

get user:online_status session:abc123

Получение информации о ключах (статус, время жизни):

stats cachedump <номер_сегмента> <количество>

Обновление данных (Update)

Изменение значения строки:

set user:online_status false 0 60

Инкрементация числа (счетчик посещений):

incr counter:page_views 1

Декрементация числа:

decr counter:downloads 1

Удаление данных (Delete)

Удаление конкретного ключа:

delete user:1001

Удаление всех ключей (осторожно!):

flush_all

Примечание: Команда flush_all удаляет все данные во всех сегментах памяти. Можно добавить задержку:

flush_all 60

(Очистка произойдет через 60 секунд).


Создание представлений (Views)

В Memcached нет концепции представлений (VIEW). Данные хранятся в плоском виде. Реализация виртуальных таблиц достигается на уровне приложения путем агрегации нескольких ключей.

Пример реализации «представления» через агрегацию

Представление списка активных пользователей формируется в коде приложения путем выборки набора ключей:

# Псевдокод приложения
active_users = []
for key in ["user:1", "user:2", "user:3"]:
data = cache.get(key)
if data and json.loads(data)["status"] == "active":
active_users.append(json.loads(data))

Использование префиксов для группировки

Хотя прямого поиска по шаблону нет, приложение может поддерживать список ключей в отдельной коллекции (например, в Redis или базе данных), чтобы знать, какие ключи существуют.


Создание функций и процедур с агрегатными функциями и Join

В Memcached отсутствуют триггеры, хранимые процедуры и поддержка JOIN. Вся логика обработки данных возлагается на приложение.

Функция с агрегатными функциями

Расчет средней зарплаты невозможен внутри сервера. Приложение должно выполнить следующее:

  1. Получить список ID сотрудников из таблицы или другого источника.
  2. Запросить данные каждого сотрудника по ключу.
  3. Вычислить среднее значение в памяти приложения.

Процедура с использованием Pub/Sub

Memcached не поддерживает систему публикаций/подписок. Для обмена событиями между сервисами используются другие технологии (RabbitMQ, Kafka, Redis Pub/Sub).


Триггерная логика (Validation Rules)

Прямых триггеров в Memcached нет. Проверка условий осуществляется на стороне клиента перед отправкой команды set или add.

Пример проверки: зарплата не может быть отрицательной.

salary = get_salary_from_input()
if salary < 0:
raise ValueError("Salary cannot be negative")

cache.set(f"employee:{id}", {"salary": salary}, time=3600)

Приложение гарантирует корректность данных до их попадания в кэш.