【问题标题】:How to share Redis Connection / RedisCache in Symfony between services / controllers?如何在服务/控制器之间共享 Symfony 中的 Redis Connection / RedisCache?
【发布时间】:2019-01-17 10:20:24
【问题描述】:

我有一些控制器、Twig 扩展和其他类都需要缓存。我使用 Redis 作为缓存。目前我在每个地方都设置了一个新的 RedisCache,如下所示:

public function __construct(LoggerInterface $logger)
{
    $this->logger = $logger;


    $this->cache = new RedisCache(RedisAdapter::createConnection(getenv('REDIS_URL')), 'ImageHelper');
}

但这会创建与 Redis 后端的许多连接,我认为这对性能不利。

在我的控制器/扩展/类之间共享 RedisConnection/Client 或什至共享 RedisCache,但保留命名空间功能的最佳方式是什么?

我正在使用 Symfony 4。

【问题讨论】:

    标签: symfony redis


    【解决方案1】:

    您应该让 Redis 缓存一个服务,然后将其注入您的控制器(或其他依赖项)。如果需要,请参阅 Symfony 的 dependency injection docs

    这是一个示例,您可能需要稍后对其进行微调:

    # config/services.yaml
    services:
        redis_connection:
            class: 'RedisConnection'
            factory: ['RedisAdapter', createConnection]
            arguments: 
              - '%env(REDIS_URL)%'
    
        redis_cache:
            class: 'RedisCache'
            arguments:
              - '@redis_connection'
    

    请注意,我不知道您的类有哪些命名空间,因此您必须相应地调整配置。

    然后您还必须设置框架以将服务注入您的控制器(或其他依赖项):

    # config/services.yaml
    services:
      # ...
      App\Controller\ExampleController:
          arguments:
            - '@logger'
            - '@redis_cache'
    

    此外,您应该更新控制器以接受构造函数中的新参数,如下所示:

    public function __construct(LoggerInterface $logger, RedisCache $cache)
    {
        $this->logger = $logger;
        $this->cache = $cache;
    }
    

    如果您有任何问题,请参考service container documentation

    【讨论】:

    • 谢谢,这似乎可行,但是我不确定多个缓存是否共享同一个 RedisConnection,我是 Redis 新手,但看起来 redis 统计数据的连接数增加了3 每次我加载一个页面。难道是因为 createConnection 是一个静态方法,然后在我定义的每个缓存上都会调用它?
    • 我还必须将类名更改为它们的完全限定路径:redis_connection: class: 'RedisConnection' factory: ['Symfony\Component\Cache\Adapter\RedisAdapter', createConnection] arguments: - '%env(REDIS_URL)%' redis_cache: class: 'Symfony\Component\Cache\Simple\RedisCache' arguments: - '@redis_connection' - 'NS' redis_cache.image_helper: class: 'Symfony\Component\Cache\Simple\RedisCache' arguments: - '@redis_connection' - 'NS2'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多