【问题标题】:Use Redis for caching Doctrine 2 queries and result in Symfony 5使用 Redis 缓存 Doctrine 2 查询并生成 Symfony 5
【发布时间】:2020-08-19 21:16:22
【问题描述】:

我想在我的Symfony 5.0.8 项目中使用Redis 6.0.1 来缓存Doctrine 2 查询和结果。在添加predis/predis 包后,我尝试在cache.yaml 和doctrine.yaml 中为Doctrine 配置Redis,但我不确定我的配置是否正确。

doctrine.yaml:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                dbname: '%env(DATABASE_NAME)%'
                user: '%env(DATABASE_USER)%'
                password: '%env(DATABASE_PASSWORD)%'
                host: '%env(DATABASE_HOST)%'
                driver:  '%env(DATABASE_DRIVER)%'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

        metadata_cache_driver: ~

        query_cache_driver:
            type: pool
            id: doctrine.query_cache_pool

        result_cache_driver:
            type: pool
            id: doctrine.result_cache_pool

cache.yaml:

framework:
    cache:
        # Redis
        app: cache.adapter.redis
        default_redis_provider: redis://localhost

您对我的 Redis 配置是否正确?以及如何测试 Redis 在我的项目中是否有效?

提前致谢

【问题讨论】:

    标签: php symfony redis doctrine-orm


    【解决方案1】:

    我终于成功了,我给和我一样情况的人提供解决方案:

    cache.yaml:

    framework:
        cache:
            app: cache.adapter.redis
            default_redis_provider: "redis://%env(REDIS_HOST)%:%env(REDIS_PORT)%"
    
            pools:
                doctrine.result_cache_pool:
                    adapter: cache.adapter.redis
    
                doctrine.system_cache_pool:
                    adapter: cache.adapter.redis
    

    doctrine.yaml:

    doctrine:
        dbal:
            default_connection: default
            connections:
                default:
                    dbname: '%env(DATABASE_NAME)%'
                    user: '%env(DATABASE_USER)%'
                    password: '%env(DATABASE_PASSWORD)%'
                    host: '%env(DATABASE_HOST)%'
                    driver:  '%env(DATABASE_DRIVER)%'
    
        orm:
            auto_generate_proxy_classes: true
            naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
            auto_mapping: true
            mappings:
                App:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity'
                    prefix: 'App\Entity'
                    alias: App
    
            metadata_cache_driver: ~
    
            query_cache_driver:
                type: pool
                pool: doctrine.system_cache_pool
    
            result_cache_driver:
                type: pool
                pool: doctrine.result_cache_pool
    

    在一个 Doctrine Repository 中,我创建了这个函数,我在所有存储库函数中都使用它:

    protected function getQueryBuilder(): QueryBuilder
    {
        return $this->createQueryBuilder('article')
                    ->setCacheMode(Cache::MODE_NORMAL)
                    ->setCacheable(true)
                    ->setLifetime(300);
    }
    

    docker-compose.yaml:

    version: "3.4"
    
    services:
      php:
        ...
        depends_on:
          - redis
    
      redis:
        image: redis:6.0.1
        ports:
          - 6379:6379
        volumes:
          - ./docker/redis/redis.conf:/redis.conf
        command: [ "redis-server", "/redis.conf" ]
    

    .env.local:

    ###> Redis ###
    REDIS_HOST=redis
    REDIS_PORT=6379
    ###> Redis ###
    

    【讨论】:

      猜你喜欢
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多