尝试在我的Symfony 5应用程序中使用带有标记的Redis,但似乎无法让RedisTagAwareAdapter工作。保存到不带标记的Redis很好,如下所示:
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Contracts\Cache\ItemInterface;
$client = RedisAdapter::createConnection(
'redis://redis'
);
$cache = new RedisAdapter($client);
$key = "testkey";
$data = "hello world";
$cacheItem = $cache->getItem($key);
$cacheItem->set($data);
$cacheItem->expiresAfter(3600);
$cache->save($cacheItem);
但是,如果我切换到使用RedisTagAwareAdapter作为这表明,则不会保存任何内容:
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
use Symfony\Contracts\Cache\ItemInterface;
$client = RedisAdapter::createConnection(
'redis://redis'
);
$cache = new RedisTagAwareAdapter($client);
$key = "testkey";
$data = "hello world";
$cacheItem = $cache->getItem($key);
$cacheItem->set($data);
$cacheItem->tag('greeting');
$cacheItem->expiresAfter(3600);
$cache->save($cacheItem);
$cache->save()返回false。不会引发其他错误。
我使用Symfony 5,Redis服务器版本6.2.5,并安装了phpredis。对我做错了什么有什么想法吗?提亚
发布于 2022-02-01 08:22:14
解决方案使一切变得简单得多:D
CacheAdapter (来自DoctrineCache2.x)使-although变得有点奇怪--负载更简单。
在您的示例中,代码如下所示:
[...]
$cacheItem = $cache->get($key, function(ItemInterface $item) {
$item->expire(3600);
$item->tag('greeting');
return "hello world";
});
现在,我知道这看起来有点适得其反,乍一看几乎没有任何意义,但下面是实际发生的情况:
首先,它尝试在$key
中获取项,如果没有命中,则函数回调将生效。它将创建一个新项,设置标记和生存期,并将返回值赋值为存储在键上的值(这是奇怪的部分)。虽然它看起来很复杂,但实际上是非常聪明的,因为所有的数据收集都是在没有针对特定键的缓存命中的情况下进行的。
https://stackoverflow.com/questions/69558211
复制相似问题