← Назад к вопросам

Как устроен Redis?

2.0 Middle🔥 251 комментариев
#Базы данных (NoSQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как устроен Redis?

Redis (Remote Dictionary Server) — это высокопроизводительное in-memory хранилище данных, которое работает с парами ключ-значение. Это один из самых популярных инструментов для кеширования, сессий и очередей сообщений.

Основная архитектура

Redis работает как одноузловой сервер на базе архитектуры клиент-сервер:

  1. Однопоточная архитектура — весь код выполняется в одном потоке, что исключает race conditions и необходимость синхронизации
  2. In-memory хранилище — все данные находятся в оперативной памяти (RAM), что обеспечивает экстремальную скорость (микросекунды)
  3. Синхронное I/O — использует event-driven модель на epoll/kqueue для обработки множественных клиентов без блокировки

Структуры данных

Redis поддерживает несколько встроенных структур:

# String (строки и числа)
redis_client.set("counter", "10")
redis_client.incr("counter")

# List (двусвязный список)
redis_client.lpush("queue", "task1", "task2")
redis_client.rpop("queue")

# Set (множество)
redis_client.sadd("tags", "python", "web")
redis_client.smembers("tags")

# Hash (словарь)
redis_client.hset("user:1", "name", "John", "age", "30")
redis_client.hgetall("user:1")

# Sorted Set (множество с оценками)
redis_client.zadd("leaderboard", {"alice": 100, "bob": 95})
redis_client.zrange("leaderboard", 0, -1, withscores=True)

Персистентность

  1. RDB (Redis Database) — снимок всей БД в конкретный момент времени. Быстрое восстановление, но может потеря данные между снимками.

  2. AOF (Append Only File) — запись всех команд, которые изменяют состояние. Безопаснее, но медленнее при восстановлении.

Практический пример

import redis
from datetime import timedelta

class CacheManager:
    def __init__(self):
        self.redis = redis.Redis(host="localhost", port=6379, decode_responses=True)
    
    def cache_result(self, key, value, ttl=3600):
        self.redis.setex(key, ttl, value)
    
    def get_or_compute(self, key, compute_func, ttl=3600):
        result = self.redis.get(key)
        if result:
            return result
        result = compute_func()
        self.cache_result(key, result, ttl)
        return result
    
    def add_to_queue(self, queue_name, item):
        self.redis.rpush(queue_name, item)
    
    def process_queue(self, queue_name):
        while True:
            item = self.redis.lpop(queue_name)
            if not item:
                break
            yield item
    
    def increment_counter(self, key):
        return self.redis.incr(key)

Важные характеристики

  • Скорость — 100,000+ операций в секунду
  • Модель памяти — максимально использует доступную RAM
  • Репликация — slave может копировать данные с master
  • Transactions (MULTI/EXEC) — атомарное выполнение групп команд
  • Pub/Sub — система подписок для сообщений

Когда использовать

✅ Кеширование результатов запросов и сессий ✅ Очереди задач ✅ Лидерборды (Sorted Sets) ✅ Real-time счётчики ✅ Блокировки и мьютексы ✅ Pub/Sub для уведомлений в реальном времени

❌ Для больших объёмов данных (есть лимит памяти) ❌ Когда нужна сложная схема данных ❌ Когда требуется ACID гарантия на уровне многих транзакций

Redis — это не просто кеш, а полноценное in-memory хранилище, которое стало стандартом индустрии для высоконагруженных систем.