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

По какому принципу работает Redis

2.0 Middle🔥 131 комментариев
#DevOps и инфраструктура#Django

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

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

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

Основные принципы Redis

Redis — это in-memory data store (хранилище данных в памяти), которое работает по принципу key-value хранилища. Вот его ключевые характеристики:

1. In-Memory (в оперативной памяти)

Все данные хранятся в RAM, а не на диске. Это обеспечивает экстремально быстрый доступ — операции выполняются за микросекунды:

import redis

r = redis.Redis(host='localhost', port=6379)

# SET: O(1) операция, очень быстро
r.set('user:1:name', 'Alice')

# GET: O(1) операция
name = r.get('user:1:name')  # 'Alice'

# Скорость: ~1 микросекунда на операцию

2. Single-Threaded с Event Loop

Redis обрабатывает команды в одном потоке с использованием event loop. Это означает:

  • Нет race conditions — все операции атомарны
  • Нет нужды в lock'ах — безопасность по умолчанию
  • FIFO очерёдность — команды выполняются по порядку
  • Полная предсказуемость
# Команды выполняются последовательно в Redis-сервере
# Нет параллелизма, но нет и race conditions

r.set('counter', 0)
r.incr('counter')  # counter = 1, гарантированно атомарно
r.incr('counter')  # counter = 2
r.get('counter')   # '2'

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

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

Strings (строки)

r.set('key', 'value')
r.append('key', ' more')
r.getrange('key', 0, 4)  # 'value'

Lists (списки)

r.rpush('tasks', 'task1', 'task2')
r.lpush('tasks', 'urgent_task')
r.lrange('tasks', 0, -1)  # Все элементы

Sets (множества)

r.sadd('users', 'alice', 'bob', 'charlie')
r.scard('users')  # 3
r.sismember('users', 'alice')  # True

Sorted Sets (отсортированные множества)

r.zadd('leaderboard', {'alice': 100, 'bob': 90, 'charlie': 95})
r.zrange('leaderboard', 0, -1, withscores=True)  # Отсортировано по score

Hashes (хеши)

r.hset('user:1', mapping={'name': 'Alice', 'age': 30, 'email': 'alice@example.com'})
r.hget('user:1', 'name')  # 'Alice'
r.hgetall('user:1')  # {'name': 'Alice', 'age': '30', 'email': 'alice@example.com'}

4. Persistence (опциональная сохранность)

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

RDB (Redis Database)

# Снимок в момент времени
# Быстро, компактно, но может потерять данные между снимками

AOF (Append-Only File)

# Логирует каждую команду
# Медленнее, но надёжнее

5. TTL (Time To Live)

Redis поддерживает автоматическое истечение ключей:

# Установить значение с TTL 1 час
r.setex('session:123', 3600, 'user_data')

# Или отдельно
r.set('temp_token', 'abc123')
r.expire('temp_token', 300)  # Истечёт через 300 секунд

# Проверить TTL
ttl = r.ttl('temp_token')  # Осталось секунд

6. Использование как кэша

Типичное применение Redis — кэширование результатов дорогих операций:

def get_user_profile(user_id):
    # Проверить кэш
    cached = r.get(f'user:{user_id}:profile')
    if cached:
        return json.loads(cached)
    
    # Получить из БД (дорого)
    user = db.query(User).filter(User.id == user_id).first()
    profile = {
        'name': user.name,
        'email': user.email,
        'posts': user.posts_count
    }
    
    # Сохранить в кэш на 1 час
    r.setex(f'user:{user_id}:profile', 3600, json.dumps(profile))
    return profile

7. Pub/Sub (Publish/Subscribe)

Redis поддерживает message broker функционал:

import redis
from threading import Thread

r = redis.Redis()

def subscriber():
    pubsub = r.pubsub()
    pubsub.subscribe('notifications')
    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f'Получено: {message["data"]}')

# Запустить подписчика в отдельном потоке
Thread(target=subscriber, daemon=True).start()

# Публиковать сообщение
r.publish('notifications', 'Hello, world!')

8. Пипелайнинг (Pipelining)

Можно отправить несколько команд сразу:

pipe = r.pipeline()
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.incr('counter')
results = pipe.execute()  # Все команды выполняются сразу

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

  • ✅ Кэширование (сессии, результаты запросов)
  • ✅ Rate limiting и throttling
  • ✅ Очереди задач (Celery)
  • ✅ Таймеры и расписание
  • ✅ Leaderboards (отсортированные множества)
  • ✅ Real-time analytics
  • ✅ Message queues (Pub/Sub)
  • ❌ Не для хранения больших объёмов (есть лимит памяти)
  • ❌ Не для сложных транзакций (есть MULTI, но ограничено)

Вывод

Redis — это быстрый, простой и надёжный key-value store для нужд, требующих скорости. Его single-threaded архитектура с event loop обеспечивает одновременно скорость и безопасность.