如何仅针对某个控制器操作禁用实体缓存到 Redis?
How to disable entity caching to Redis only for a certain controller action?
我有一个控制器操作在 database/entities 上执行一些繁重的工作。在分析时,我注意到写入 Redis 的缓存层浪费了很多时间。有什么办法可以只针对这个特定的路由禁用二级缓存到Redis吗?
您可以禁用缓存或更改每个查询,例如useQueryCache()
or useResultCache()
.
在您的存储库中,您可以使用 $this->createQueryBuilder()
构建查询。或者,实体管理器提供了一个 createQuery()
方法,它接受一个 DQL 字符串。在从这些方法中的任何一个生成的查询对象上,在查询对象上调用 getResult()
之前,您可以调用这些方法。
找到了一种方法:
扩展 Symfony\Component\Cache\DoctrineProvider
class 并覆盖 save
和 saveMultiple
方法。在 class 上使用静态布尔变量来控制保存到缓存:
// Your custom class that extends the DoctrineProvider
public function save($id, $data, $lifeTime = 0)
{
if (static::$enableWriting === false) {
return false;
}
return parent::save($id, $data, $lifeTime);
}
// packages/doctrine.yaml
services:
doctrine.result_cache_provider:
class: App\Cache\ResultCacheDoctrineProvider
public: false
arguments:
- '@doctrine.result_cache_pool'
我有一个控制器操作在 database/entities 上执行一些繁重的工作。在分析时,我注意到写入 Redis 的缓存层浪费了很多时间。有什么办法可以只针对这个特定的路由禁用二级缓存到Redis吗?
您可以禁用缓存或更改每个查询,例如useQueryCache()
or useResultCache()
.
在您的存储库中,您可以使用 $this->createQueryBuilder()
构建查询。或者,实体管理器提供了一个 createQuery()
方法,它接受一个 DQL 字符串。在从这些方法中的任何一个生成的查询对象上,在查询对象上调用 getResult()
之前,您可以调用这些方法。
找到了一种方法:
扩展 Symfony\Component\Cache\DoctrineProvider
class 并覆盖 save
和 saveMultiple
方法。在 class 上使用静态布尔变量来控制保存到缓存:
// Your custom class that extends the DoctrineProvider
public function save($id, $data, $lifeTime = 0)
{
if (static::$enableWriting === false) {
return false;
}
return parent::save($id, $data, $lifeTime);
}
// packages/doctrine.yaml
services:
doctrine.result_cache_provider:
class: App\Cache\ResultCacheDoctrineProvider
public: false
arguments:
- '@doctrine.result_cache_pool'