Zf2 Redis Adapter,getItems使用通配符

时间:2014-07-31 08:54:48

标签: zend-framework2 redis

我是在ZF2下使用Redis的第一步。 我想知道是否有一种按模式检索密钥的方法。

例如为: 在使用以下键设置多个值之后:' stackOverflow _' .time(),我想稍后检索所有匹配' stackOverflow _'图案。

尝试使用带有通配符的getItems(数组$ keys):\ vendor \ zendframework \ zendframework \ library \ Zend \ Cache \ Storage \ Adapter \ AbstractAdapter.php

$redisKeyPattern = 'stackOverflow_'; 
$redis = $this->getServiceLocator()->get('Redis');
$values = $redis->getItems(array($redisKeyPattern.'*'));

没有succces。

任何想法?


UDPATE: 多谢你们。我最终复制了Redis适配器并添加了我自己的功能,利用了'键'函数在Redis扩展中:

 public function getItemsByKeyPattern($pattern) {

    $keys = $this->getRedisResource()->keys('*'.$pattern.'*'); 
    if(empty($keys)) return null;

    foreach($keys as &$key){        
        $key = explode(':', $key)[1];
    }

    $items = parent::getItems($keys);
    return $items;
}

它适用于我:)

2 个答案:

答案 0 :(得分:0)

遗憾的是,没有方法可以返回带有通配符的项目,redis也不支持存储项目的名称空间。

你需要定义你想要接收的每个项目,也许你应该看看像这样的实现

$receiveRedisKeys = [];
foreach($resultSet as $result)
{
    $receiveRedisKeys[] = 'predefined_prefix_' . $result->getId();
}

$redisCacheResultSet = $redis->getItems($receiveRedisKeys);

我知道github上有人创建了一个新的存储库,他修改了redis以允许namespaces,但这需要你自己从源代码构建redis binarys。这会导致redis版本无法再更新apt-get

答案 1 :(得分:0)

这是不可能的,但也有一些替代方案。

一个想法是使用您感兴趣的键保留一个集合。这是解决此问题的最常见方法:每次创建一个您希望稍后检索的键时,将其名称添加到集合中。然后,当您需要操作其中一个键时,您可以从该组中获取它。阅读this article以获得有关此方法的一般概念。

另一个想法是使用SCAN命令使用您正在使用的模式遍历键空间,第二步使用MGET检索值,然后使用您收集的键。这种方法适用于管理流程,但不适合应该包含在应用程序中,因为性能会比第一个想法更差。有关SCAN的更多信息。

最后,一个不推荐但我只是为了完整而列出它的选项是使用KEYS命令来收集你想要的密钥,然后继续使用{{1}获取值},如MGET方法。建议不要这样做,因为SCAN不应在生产环境中使用。有关KEYS的更多信息。