Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SymfonyВсе вопросы
SymfonySeniorПроектирование систем

Как реализовать кэширование в Symfony с помощью компонента Cache?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Symfony Cache реализован через PSR-6/PSR-16 адаптеры (Redis, Memcached, Filesystem и др.) и настраивается в framework.cache. Используйте CacheInterface, TagAwareCacheInterface или низкоуровневый CacheItemPoolInterface для управления записями.

Конфигурация в config/packages/cache.yaml

framework:
  cache:
    app: cache.adapter.redis
    default_redis_provider: 'redis://localhost:6379'
    pools:
      cache.product_catalog:
        adapter: cache.adapter.redis
        default_lifetime: 3600
        tags: true
      cache.user_sessions:
        adapter: cache.adapter.filesystem
        default_lifetime: 86400

Архитектура компонента Cache

Symfony Cache реализует PSR-6 (CacheItemPoolInterface) и PSR-16 (CacheInterface). Все адаптеры живут в пакете symfony/cache. Основные адаптеры:

  • RedisAdapter — для Redis/Redis Cluster через \Redis или \RedisCluster
  • FilesystemAdapter — кэш на диске, подходит для разработки
  • MemcachedAdapter — для Memcached
  • ArrayAdapter — in-memory, используется в тестах
  • ChainAdapter — последовательная цепочка из нескольких адаптеров (L1/L2 кэш)
  • TagAwareAdapter — обёртка для инвалидации по тегам

Использование через CacheInterface (PSR-16-like)

<?php

use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;

class ProductService
{
    public function __construct(
        private readonly CacheInterface $cache,
    ) {}

    public function getProduct(int $id): array
    {
        return $this->cache->get(
            sprintf('product_%d', $id),
            function (ItemInterface $item) use ($id): array {
                $item->expiresAfter(3600);
                $item->tag(['product', sprintf('product_%d', $id)]);
                // имитируем запрос к БД
                return $this->fetchFromDatabase($id);
            }
        );
    }

    public function invalidateProduct(int $id): void
    {
        // TagAwareCacheInterface нужен для инвалидации по тегу
        if ($this->cache instanceof \Symfony\Contracts\Cache\TagAwareCacheInterface) {
            $this->cache->invalidateTags([sprintf('product_%d', $id)]);
        }
    }
}

Инъекция именованного пула

Когда нужен конкретный пул, а не cache.app, используйте атрибут #[Target] или явную привязку в сервисах:

# config/services.yaml
services:
  App\Service\CatalogService:
    arguments:
      $catalogCache: '@cache.product_catalog'
<?php

use Psr\Cache\CacheItemPoolInterface;

class CatalogService
{
    public function __construct(
        private readonly CacheItemPoolInterface $catalogCache,
    ) {}

    public function getCategories(): array
    {
        $item = $this->catalogCache->getItem('categories');
        if (!$item->isHit()) {
            $item->set($this->loadCategories());
            $item->expiresAfter(7200);
            $this->catalogCache->save($item);
        }
        return $item->get();
    }
}

ChainAdapter: L1 + L2 кэш

framework:
  cache:
    pools:
      cache.hot:
        adapters:
          - cache.adapter.array      # L1: in-process
          - cache.adapter.redis      # L2: Redis
        default_lifetime: 300

При промахе L1 Symfony автоматически заполняет его из L2, поэтому первый запрос в процессе обращается к Redis, а последующие — к памяти.

Инвалидация и команды CLI

# очистить весь пул приложения
php bin/console cache:pool:clear cache.app

# очистить именованный пул
php bin/console cache:pool:clear cache.product_catalog

# список всех пулов
php bin/console cache:pool:list

Подводные камни

  • TagAwareAdapter и Redis: нужен отдельный адаптер cache.adapter.redis_tag_aware; использование обычного cache.adapter.redis с тегами бросит исключение в рантайме.
  • Сериализация объектов: по умолчанию применяется igbinary или PHP serialize; объекты без __sleep/__wakeup могут кэшироваться с лишними полями или вовсе сломать десериализацию после деплоя.
  • Отравление кэша при деплое: если схема данных изменилась, старые записи возвращают невалидные данные; всегда инкрементируйте namespace или ключи версионирования.
  • cache.app vs cache.system: cache.system используется Symfony внутри (роутинг, аннотации); очищать его вручную опасно — он сбрасывается только через cache:clear.
  • ArrayAdapter в production: данные живут только в пределах одного HTTP-запроса; если пул случайно остаётся ArrayAdapter в prod-конфиге, кэш не работает.
  • Гонка при прогреве (stampede): несколько процессов одновременно вычисляют значение при промахе; используйте $item->beta(INF) для «раннего» продления или отдельный lock.
  • Lifetime = 0: в большинстве адаптеров означает «хранить вечно», а не «не кэшировать»; при ошибке конфигурации Redis постепенно заполняется до maxmemory.
  • Тесты: не подменяйте prod-пул вручную — объявите пул с адаптером cache.adapter.array в config/packages/test/cache.yaml, иначе интеграционные тесты читают/пишут в реальный Redis.

Частые вопросы на собеседовании

  • Как Symfony обрабатывает защиту от CSRF?
  • Как устроен Dependency Injection container compile pass?
  • Как работает service container (контейнер dependency injection) в Symfony?
  • В каких backend-проектах Symfony является сильным выбором, а где лучше выбрать более простой или другой стек?

Типичные ошибки

  • Сводить cache к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Symfony 7/8 строит request lifecycle вокруг HttpKernel, events, routing, controller resolver и response listeners.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Не обсуждать idempotency, retries, shutdown и observability.

Что проверяет интервьюер

  • Объясняет cache через конкретную точку lifecycle в Symfony.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.
  • Связывает решение с метриками, backpressure, retry policy и graceful shutdown.

Как вы знаете этот вопрос?

Проверить себя по теме Symfony →

Источники

  • https://symfony.com/doc/current/cache.html
  • https://symfony.com/doc/current/index.html

Связанные темы

SymfonyBackend-Engineeringproduction-readinesssymfony-ecosystemsystem-design