【问题标题】:How to use caching and pagination in symfony with doctrine?如何在 symfony 中使用缓存和分页与学说?
【发布时间】:2018-01-12 05:27:30
【问题描述】:

我有一个 Symfony REST API 应用程序。
在存储库中我检索一些数据并使用 Doctrine Paginator 进行分页,然后在控制器中我使用 Symfony Serializer 将这些数据序列化为 JSON。

存储库方法:

public function getCategories($limit, $offset)
    {
        $qb = $this->em->createQueryBuilder()
            ->select('c')
            ->from('Category:Category', 'c')
            ->getQuery()->setFirstResult($offset)
            ->setMaxResults($limit);
        $paginator = new Paginator($qb);
        return ['total' => count($paginator), 'items' => $paginator];
    }

在控制器中:

    $data = $this->serializer->serialize($data, 'json', $context);
    return new JsonResponse($data, $code, [], true);

现在我想使用 Redis 实现数据缓存。我该怎么做?
我应该将序列化程序注入存储库,在那里序列化我的数据并将标量值存储在 Redis 中吗?
或者我应该使用 Doctrine Result Cache(它没有说明分页查询)?

【问题讨论】:

    标签: php symfony caching pagination doctrine


    【解决方案1】:

    有 3 种缓存机制可供选择。

    1) 您可以使用HttpCache component。如果您有大量流量并且您知道数据何时更改,那么这通常是一个不错的设计,因此您可以使它们无效。

    2) 您可以从学说 dbal/orm 组件中获取 ResultCache。如果这是对数据库的繁重查询并且结果仅在几分钟内有效,我将使用此技术。

    我不是你所说的“它没有说明分页查询”是什么意思,因为它取决于你,哪个查询应该被缓存,哪些不应该。

    public function getCategoriesQuery($limit, $offset) 
    {
        return $this->createQueryBuilder('c')
            ->getQuery()->setFirstResult($offset)
            ->setMaxResults($limit)->useResultCache(true);
    }
    

    3) Doctrine 为几个版本引入了一种新的缓存机制,称为“second level cache”。这是一种更灵活的缓存机制,允许开发人员在数据被驱逐时拥有更多控制权。

    不应将序列化程序注入到存储库中。存储库只有一件事要做,即读取数据。序列化器更像是view layer

    【讨论】:

    • “这对分页查询一无所知” - 我的意思是我使用 Doctrine Paginator 实现 Traversable 接口,只有在我迭代 Paginator 时才会给我数据。
    • 好的,但是结果缓存根本不影响分页器,因为结果缓存在幕后工作。
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多