Компонент Symfony Cache - адаптер Redis

Я реализовал компонент кэша Symfony, используя RedisAdapter. Теперь нам нравится использовать двоеточие в качестве разделителя в ключах кэша (например, some:cache:key:25). Так же, как Redis рекомендует.

Я получаю исключение, говоря "contains reserved characters {}()/\@: etc.". Это объясняется в документации Symfony

( https://symfony.com/doc/3.4/components/cache/cache_items.html), что это зарезервированные символы в PSR-6.

Я хотел бы знать, есть ли способ обойти это? Потому что я занят рефакторингом кеш-логики с использованием Symfony Cache Component. Но ключи уже определены, поэтому я не могу изменить их без нарушения соглашений.

2 ответа

Как вы заметили : является зарезервированным символом в стандарте кэширования PSR-6, на котором основан компонент кэша Symfony.

Если вы хотите сохранить их в своем коде, вы можете написать адаптер, который заберет ваши ключи и заменит : с чем-то еще, прежде чем передать его в обычный кэш.

Например, вы можете написать адаптер, который будет выглядеть примерно так:

class MyCacheAdapter implements AdapterInterface
{
    private $decoratedAdapter;

    public function __construct(AdapterInterface $adapter)
    {
        $this->decoratedAdapter = $adapter;
    }

    public function getItem($key): CacheItemInterface
    {
        $key = str_replace(':', '.', $key);

        return $this->decoratedAdapter->getItem($key);
    }

    ...
}

Для всех остальных методов вы можете просто передать вызов оформленному сервису и вернуть результат. Это немного раздражает, но интерфейс требует этого.

В конфигурации вашего сервиса вы можете настроить его следующим образом:

services:
    App\Cache\MyCacheAdapter:
        decorates: 'Symfony\Component\Cache\Adapter\RedisAdapter'
        arguments:
            $adapter: '@app.cache.adapter.redis'

Эта конфигурация - только грубая схема, и аргумент и имена классов, возможно, должны быть скорректированы. В любом случае с этим украшением службы ваш адаптер оборачивается вокруг оригинального адаптера Redis, а затем, когда вы настраиваете его для использования компонентом кэша, он должен работать нормально, что ваши существующие ключи, как some:cache:key25 будет преобразован в some.cache.key25 до того, как они будут переданы в компонент кеша, так до того, как появится сообщение об ошибке.

В дополнение к ответу @dbrumann: точка с запятой — не единственный зарезервированный символ.ItemInterface::RESERVED_CHARACTERSесть полный список. Другие подходы к обеспечению безопасности ключа кэша:

      $cacheKey = str_replace(str_split(ItemInterface::RESERVED_CHARACTERS), '-', $str);

или проще

      $cacheKey = hash('crc32b', $str);
Другие вопросы по тегам