我是在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;
}
它适用于我:)
答案 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的更多信息。