如何使用 Symfony Cache 设置缓存项的键?
How to set the key for a cache item with Symfony Cache?
我正在尝试向现有的 Symfony 项目添加缓存。
但我不确定如何最好地进行
我得到一个带有 id 的数组。如果缓存中有项目,我会检查每个 id。如果没有,则中断并向数据库发送查询。
然后我会得到结果,现在我可以将这些值存储在我的缓存中。但是我不知道如何将id设置为key
public function getHelpfulResult(array $reviewIds): array
{
$helpfulCache = new FilesystemAdapter("helpful", 2 * 60 * 60, "cache");
$helpfulValues = [];
foreach ($reviewIds[0] as $id) {
$item = $helpfulCache->getItem((string)$id);
if($item->isHit()) {
array_push($helpfulValues, $item);
} else {
break;
}
}
$repo = $this->getDoctrine()->getRepository('Project:Test\Helpful', 'reviews');
$query = $repo->createQueryBuilder('helpful')
->where("helpful.parentId IN (:parentIds) AND helpful.type = 'review'")
->setParameter('parentIds', $reviewIds)
->getQuery();
$result = $query->getResult();
foreach($result as $item) {
$cache->set($item);
}
$cache->save();
return $result;
}
关于基本问题:“如何为缓存项设置 'id'”问题:
你基本上不会。您尝试通过 ID 检索缓存项,然后您已经拥有该 ID 的对象是否被命中。
您保存它,现在存在 ID 为“x”的新缓存项。
例如
$cacheItem = $cacheyAdapter->getItem('some-arbitrary-id');
if (!$cacheItem->isHit()) {
$cacheItem->set('some new value');
$cacheAdapter->save($cacheItem);
}
使用上面的代码,您将检查 some-arbitrary-id
是否存在于缓存层中,以及它是否没有为其设置值并将其存储回来。
关于问题中的其余代码,恐怕整个事情的设计都相当糟糕,缓存中的单个元素陈旧迫使您再次进行整个查询并从数据库中检索所有内容.
我不打算花时间讨论这个问题,因为它超出了这个问题的范围(而且对于 SO 来说太宽泛和固执己见),一些基本的想法:
- 序列化整个查询的结果并缓存that
- 从第二次查询中排除您在缓存中命中的 ID(将它们从数组
$reviewIds
中删除)。此外,将未命中的缓存项保存在另一个数组中,以便当您从数据库中获取它们时,您可以更新缓存层中的那些项。最后在返回之前合并来自缓存和数据库的结果。
我正在尝试向现有的 Symfony 项目添加缓存。 但我不确定如何最好地进行 我得到一个带有 id 的数组。如果缓存中有项目,我会检查每个 id。如果没有,则中断并向数据库发送查询。 然后我会得到结果,现在我可以将这些值存储在我的缓存中。但是我不知道如何将id设置为key
public function getHelpfulResult(array $reviewIds): array
{
$helpfulCache = new FilesystemAdapter("helpful", 2 * 60 * 60, "cache");
$helpfulValues = [];
foreach ($reviewIds[0] as $id) {
$item = $helpfulCache->getItem((string)$id);
if($item->isHit()) {
array_push($helpfulValues, $item);
} else {
break;
}
}
$repo = $this->getDoctrine()->getRepository('Project:Test\Helpful', 'reviews');
$query = $repo->createQueryBuilder('helpful')
->where("helpful.parentId IN (:parentIds) AND helpful.type = 'review'")
->setParameter('parentIds', $reviewIds)
->getQuery();
$result = $query->getResult();
foreach($result as $item) {
$cache->set($item);
}
$cache->save();
return $result;
}
关于基本问题:“如何为缓存项设置 'id'”问题:
你基本上不会。您尝试通过 ID 检索缓存项,然后您已经拥有该 ID 的对象是否被命中。
您保存它,现在存在 ID 为“x”的新缓存项。
例如
$cacheItem = $cacheyAdapter->getItem('some-arbitrary-id');
if (!$cacheItem->isHit()) {
$cacheItem->set('some new value');
$cacheAdapter->save($cacheItem);
}
使用上面的代码,您将检查 some-arbitrary-id
是否存在于缓存层中,以及它是否没有为其设置值并将其存储回来。
关于问题中的其余代码,恐怕整个事情的设计都相当糟糕,缓存中的单个元素陈旧迫使您再次进行整个查询并从数据库中检索所有内容.
我不打算花时间讨论这个问题,因为它超出了这个问题的范围(而且对于 SO 来说太宽泛和固执己见),一些基本的想法:
- 序列化整个查询的结果并缓存that
- 从第二次查询中排除您在缓存中命中的 ID(将它们从数组
$reviewIds
中删除)。此外,将未命中的缓存项保存在另一个数组中,以便当您从数据库中获取它们时,您可以更新缓存层中的那些项。最后在返回之前合并来自缓存和数据库的结果。