在Symfony 5中使用Redis标记



尝试在我的Symfony 5应用程序中使用Redis标记,但似乎无法让RedisTagAwareAdapter工作。保存到没有标签的Redis工作就像这样:

use SymfonyComponentCacheAdapterRedisAdapter;
use SymfonyContractsCacheItemInterface;
$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 SymfonyComponentCacheAdapterRedisAdapter;
use SymfonyComponentCacheAdapterRedisTagAwareAdapter;
use SymfonyContractsCacheItemInterface;
$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。你知道我哪里做错了吗?TIA

解决方案使一切变得简单得多:D

CacheAdapter(来自DoctrineCache2.x)使事情(尽管有点奇怪)加载更简单。

在您的例子中,代码看起来像这样:

[...]
$cacheItem = $cache->get($key, function(ItemInterface $item) {
$item->expire(3600);
$item->tag('greeting');
return "hello world";
});

现在我知道这看起来有点适得其反,乍一看几乎没有任何意义,但这是实际发生的:

首先尝试获取$key处的项目,如果没有命中,则回调函数开始操作。它将创建一个新项,设置标签和生存期,并将返回值分配为存储在key处的值(这是奇怪的部分)。虽然看起来复杂其实很聪明因为收集的所有数据仅做如果没有缓存命中的特定关键。

最新更新