我在配置文件中启用了第二个缓存级别:
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;
}
那么,首先是什么意思是缓存命中,缓存未命中和缓存放置? 第二个现在发生了什么,如何缓存我的实体?
答案 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)
首先,这是教义的重要警告:
“二级缓存功能目前被标记为实验性。这是一个非常复杂的功能,我们尚不能保证在所有情况下都能稳定运行。”
所以
“如何缓存我的实体?”
在app / config.yml中启用第二个lvl缓存
doctrine:
orm:
second_level_cache:
enabled: true
您还应该为每种数据类型(实体数据,集合数据或查询数据)指定缓存区域:
regions:
entity_that_rarely_changes:
lifetime: 86400
cache_driver: redis
type: service
id: snc_second_level_cache
配置您的实体/实体:
和一个区域(请参见上文)
/**
* @Cache(usage="READ_ONLY", region="my_entity_region")
*/
class MyEntity
最后:您的查询:
$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
“这意味着高速缓存命中,高速缓存未命中和高速缓存放置”
您应该在
中检查您的实体缓存区域参数@Cache(usage="READ_ONLY", region="my_entity_region")
和您的config yml文件,例如:
regions:
my_entity_region:
cache_driver: redis
lifetime: 3600
如果(区域的名称)不同,则实体缓存将始终“丢失”。
我使用了很多外部资源,例如Doctrine 2 documentation。 您应该这样做;)