如何在学说中启用第二个缓存级别?

时间:2017-02-28 07:18:03

标签: symfony caching doctrine-orm

我在配置文件中启用了第二个缓存级别:

  orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        second_level_cache:
            region_cache_driver:
                type:                 array
                host:                 ~
                port:                 ~
                instance_class:       ~
                class:                ~
                id:                   ~
                namespace:            ~
                cache_provider:       ~
            region_lock_lifetime: 600
            log_enabled:          true
            region_lifetime:      0
            enabled:              true

在我需要缓存的实体中,添加新的注释(Cache),如:

/**
 * Entity
 *
 * @ORM\Table(name="entity")
 * @ORM\Cache(usage="READ_ONLY", region="entity_cache")
 */
class Entity
{

/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
  private $id;

}

但现在就说明一下:
enter image description here

那么,首先是什么意思是缓存命中,缓存未命中和缓存放置? 第二个现在发生了什么,如何缓存我的实体?

2 个答案:

答案 0 :(得分:2)

在Symfony 5.1上进行了测试,您无需添加任何捆绑包或软件包。您要做的只是接近:

# config/packages/dev/cache.yaml
framework:
    cache:
        app: cache.adapter.redis
        default_redis_provider: redis://localhost
# config/packages/dev/doctrine.yaml
doctrine:
    orm:
        second_level_cache:
            enabled: true
            region_cache_driver:
                type: pool
                pool: doctrine.second_level_cache_pool
framework:
    cache:
        pools:
            doctrine.second_level_cache_pool:
                adapter: cache.app

例如,在您的实体上:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Cache
 */
class Category { ... }

答案 1 :(得分:1)

首先,这是教义的重要警告:

“二级缓存功能目前被标记为实验性。这是一个非常复杂的功能,我们尚不能保证在所有情况下都能稳定运行。”

所以

  

“如何缓存我的实体?”

  1. 您需要设置一个缓存提供程序(redis,memcached等)
  2. 在作曲家require中添加原则和缓存提供程序依赖项
  3. 配置缓存提供程序
  4. 在app / config.yml中启用第二个lvl缓存

    doctrine:
      orm:
        second_level_cache:
          enabled: true
    
  5. 您还应该为每种数据类型(实体数据,集合数据或查询数据)指定缓存区域:

    regions:
      entity_that_rarely_changes:
        lifetime: 86400
        cache_driver: redis
        type: service
        id: snc_second_level_cache
    
  6. 配置您的实体/实体:

    • 选择一种缓存模式(默认为“只读”)
    • 和一个区域(请参见上文)

      /**
      * @Cache(usage="READ_ONLY", region="my_entity_region")
      */
      class MyEntity 
      
  7. 最后:您的查询:

    $em->persist(new MyEntity($name));
    $em->flush();
    $em->clear(); // clear em
    $item1  = $em->find('MyEntity', 1); // Retrieve item from cache
    $item1->setName("newname");
    $em->persist($item1);
    $em->flush(); // update row and update cache
    $em->clear(); // clear em
    $item2  = $em->find('MyEntity', 1); // Retrieve item from cache
    
  

“这意味着高速缓存命中,高速缓存未命中和高速缓存放置”

  • hits:项目位于(声明区域的)缓存中,因此您无需查询数据库
  • 缺少:该项目不在(声明区域的)缓存中,因此您需要查询数据库
  • puts:在缓存(区域)中放入多少可缓存条目。

您应该在

中检查您的实体缓存区域参数
@Cache(usage="READ_ONLY", region="my_entity_region")

和您的config yml文件,例如:

regions:
  my_entity_region:
    cache_driver: redis
    lifetime: 3600

如果(区域的名称)不同,则实体缓存将始终“丢失”。

我使用了很多外部资源,例如Doctrine 2 documentation。 您应该这样做;)