Py学习  »  Redis

如何在服务/控制器之间共享symfony中的redis连接/rediscache?

Lasse Moos • 5 年前 • 362 次点击  

我有一些控制器、小树枝扩展和其他类都需要缓存。我用Redis作为缓存。目前,我在每个地方都设置了一个新的重新分配,比如:

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


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

但这会创建许多到redis后端的连接,我认为这对性能不好。

在控制器/扩展/类之间共享redisconnection/client,或者共享rediscache,但保持名称间距能力的最佳方法是什么?

我用的是symfony 4。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30837
 
362 次点击  
文章 [ 1 ]  |  最新文章 5 年前
kix
Reply   •   1 楼
kix    5 年前

您应该使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 如果你有任何问题。