symfony - 如何在服务/ Controller 之间共享 Symfony 中的 Redis 连接/RedisCache?

标签 symfony redis

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

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


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

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

在我的 Controller /扩展/类之间共享 RedisConnection/Client,甚至共享 RedisCache,但保持命名空间能力的最佳方式是什么?

我正在使用 Symfony 4。

最佳答案

您应该将 Redis 缓存作为一项服务,稍后将其注入(inject)您的 Controller (或其他依赖项)。引用 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'

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

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

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

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

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

引用service container documentation如果您有任何问题。

关于symfony - 如何在服务/ Controller 之间共享 Symfony 中的 Redis 连接/RedisCache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54233710/

相关文章:

php - Symfony 未定义的命名空间

symfony - 在 Twig 中包含的模板中覆盖 block

forms - Symfony2 "This form should not contain extra fields"集合和动态字段错误

css - symfony Twig 背景图像

redis - 我应该在 web 节点上运行 haproxy for db 和 redis sentinel 吗?

Redis - 可以查看单个键的命中/未命中吗?

activerecord - Yii ActiveRecord 和缓存中的 beforeFind()

php - 教义查询生成器 DATE_FORMAT 不工作

redis - 与 RabbitMQ 相比,将 Redis Pub/Sub 用于消息队列是否可靠

node.js - 为什么这个 coffeescript 代码总是返回 true?