Symfony 缓存组件 - Redis 适配器

标签 symfony caching redis symfony-cache

我已经使用 RedisAdapter 实现了 Symfony 缓存组件。现在我们喜欢在缓存键中使用冒号作为分隔符(例如 some:cache:key:25)。就像 Redis 推荐的那样。

我收到一个异常消息“包含保留字符 {}()/\@: etc.”。这在 Symfony 文档中有解释

( https://symfony.com/doc/3.4/components/cache/cache_items.html ) 这些是 PSR-6 中的保留字符。

我想知道是否有解决办法?因为我正忙于使用 Symfony 缓存组件重构缓存逻辑。但是键已经定义好了,所以我无法在不违反约定的情况下更改它们。 😭

最佳答案

如您所述,: 是 PSR-6 缓存标准中的保留字符,Symfony 的缓存组件以此为基础。

如果你想将它们保留在你的代码中,你可以编写一个适配器来获取你的 key 并将 : 替换为其他内容,然后再将其传递到常规缓存。

例如,您可以编写如下所示的适配器:

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'

这个配置只是一个粗略的轮廓,参数和类名都可能需要调整。无论如何用这个 service decoration您的适配器环绕原始的 redis 适配器,然后当您将其配置为由缓存组件使用时,它应该可以正常工作,您现有的 key 如 some:cache:key25 将被转换为 some.cache.key25 它们被传递到缓存组件之前,所以在错误消息发生之前。

关于Symfony 缓存组件 - Redis 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52887092/

相关文章:

php - 填充多个表单 Symfony2

javascript - 使用ajax、jquery和symfony2在表中显示数组数据

php - Twig+ Wordpress - 如何将数组参数传递给函数?

java - 再次设置 AtomicBoolean

python - 是否可以在 Redis 中按值获取数据?

php - 动态数据库连接symfony2

memory - 将数据存储在内存中 : Session vs Cache vs Static

java - 仅使用 JDK (6) 提供的类来改进该代码的方法? (并发、线程安全)

java - 在 Java 中反序列化 Map<byte[], byte[]>

python - Redis内存优化