如何在Symfony应用程序中为Doctrine配置Redis缓存

时间:2017-07-24 07:36:13

标签: symfony doctrine-orm redis

在我的config_prod.yml文件中,我有以下配置。我在哪里可以配置Redis驱动程序 - 例如unix socket(或主机),数据库号等选项?

doctrine:
    orm:
        metadata_cache_driver: redis
        query_cache_driver: redis
        result_cache_driver: redis

4 个答案:

答案 0 :(得分:6)

@ katona.abel给出的例子不起作用,但引导我找到这个解决方案:

#services.yml
services:
    redis_cache_service:
        class: Doctrine\Common\Cache\RedisCache
        calls:
            - method: setRedis
              arguments:
                - '@redis'

    redis:
        class: Redis
        public: false
        calls:
            - method: connect
              arguments:
                - '/var/run/redis/redis.sock' # or host/ip with port
            - method: select
              arguments:
                - 13 # change database by index
#config_prod.yml
doctrine:
    orm:
        metadata_cache_driver:
            type: service
            id: redis_cache_service
        result_cache_driver:
            type: service
            id: redis_cache_service
        query_cache_driver:
            type: service
            id: redis_cache_service

答案 1 :(得分:5)

对于symfony 4.4 / 5,这是完成的过程,因为文档有些混乱。

您需要首先设置缓存池:

#config/packages/cache.yaml

framework:
  cache:
    default_redis_provider: 'redis://localhost' # or '%env(resolve:REDIS_URL)%'

    pools:
      doctrine.result_cache_pool:
        adapter: cache.adapter.redis

然后将该池用于原则结果缓存,如下所示:

#config/packages/doctrine.yaml

doctrine:
  ...
  orm:
    result_cache_driver:
      type: pool
      pool: doctrine.result_cache_pool

答案 2 :(得分:2)

此配置应该有效

doctrine:
    orm:
        metadata_cache_driver: 
            type: redis
            connection_id: <Redis connection service id>
            host:<Redis host>
            port:<Redis port>
            password:<Redis password>
            timeout:<Redis connection timeout>
            database:<Redis database selection (integer)>
            persistent:<Whether to use persistent connection or not (bool)>

参数信息here

更新

如果您需要为所有缓存提供相同的缓存,您可以定义服务并将其传递

doctrine_cache:
    aliases:
        redis_cache: my_redis_cache
    providers:
        my_redis_cache:
            type: redis
            connection_id: <Redis connection service id>
            host:<Redis host>
            port:<Redis port>
            password:<Redis password>
            timeout:<Redis connection timeout>
            database:<Redis database selection (integer)>
            persistent:<Whether to use persistent connection or not (bool)>


doctrine:
    ...
    orm:
        entity_managers:
            default:
               ...    
               metadata_cache_driver:
                    type: service
                    id: redis_cache
                query_cache_driver:
                    type: service
                    id: redis_cache
                result_cache_driver:
                    type: service
                    id: redis_cache

答案 3 :(得分:0)

我注意到作者问的是redis,而不是predis,但我想为3.4.*找到最简单的“开箱即用”方式,如果您只想快速入门的话:

doctrine:
    orm:
        default_entity_manager: default
        entity_managers:
            default:
                metadata_cache_driver:
                    type: predis
                    host: '%app.redis.host%'
                    port: '%app.redis.port%'
                    database: 1
                result_cache_driver:
                    cache_provider: doctrine.orm.default_metadata_cache
                query_cache_driver:
                    cache_provider: doctrine.orm.default_metadata_cache

这需要predis客户端:

$ composer require predis/predis

现在会发生什么?对于学说的元数据缓存,我们用内置的Predis\Client包装了Doctrine\Common\Cache\PredisCache。结果和查询缓存驱动程序配置为元数据缓存驱动程序的别名(实际上是缓存提供程序的别名),因此它们都使用相同的数据库,主机和端口。如果您通过bin/console清除元数据缓存或通过redis-cli直接调用flushdb,则结果和查询的缓存也将被清除。

此解决方案不需要任何新服务。