Компонент 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);