【问题标题】:Symfony Cache Component - Redis AdapterSymfony 缓存组件 - Redis 适配器
【发布时间】:2019-03-24 00:49:37
【问题描述】:

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

我收到一个异常消息“contains reserved characters {}()/\@: etc.”。这在 Symfony 文档中有解释

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

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

【问题讨论】:

  • 你能分享完整准确的错误信息吗?
  • 请继续阅读this。附有bug 标签。

标签: symfony caching redis symfony-cache


【解决方案1】:

正如您所说,: 是 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'

这个配置只是一个粗略的概述,参数和类名可能需要调整。在任何情况下,使用这个service decoration,您的适配器会包裹原始的 redis 适配器,然后当您将其配置为供缓存组件使用时,它应该可以正常工作,您现有的密钥(如 some:cache:key25)将转换为 some.cache.key25 strong>在它们被传递到缓存组件之前,所以在错误消息发生之前。

【讨论】:

  • 我喜欢这种方法。多谢。问题是,我这里的人喜欢在键中使用冒号,以便 redis 客户端正常工作(例如,将 redis 值列为目录文件夹)。但也许我必须与我的团队进一步讨论。
  • 在这种情况下,如果您想在 redis 中也保留冒号,则必须编写自己的适配器,该适配器不扩展 AbstractAdapter 并且忽略验证检查。如果您查看 AbstractAdapter,您应该会看到抛出异常的位置,然后替换用于执行检查的闭包。可能缓存组件中的其他地方也需要为此进行调整。
猜你喜欢
  • 2020-03-13
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多