Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 Zf2 Redis适配器,使用通配符获取项目_Zend Framework2_Redis - Fatal编程技术网

Zend framework2 Zf2 Redis适配器,使用通配符获取项目

Zend framework2 Zf2 Redis适配器,使用通配符获取项目,zend-framework2,redis,Zend Framework2,Redis,我正在ZF2下使用Redis的第一步。 我想知道是否有一种方法可以按模式检索键 e、 g: 在使用诸如“stackOverflow”.time()之类的键设置多个值之后,我希望稍后检索与“stackOverflow”模式匹配的所有键 尝试在:\vendor\zendframework\zendframework\library\Zend\Cache\Storage\Adapter\AbstractAdapter.php中使用带有通配符的getItems(数组$keys) $redisKeyPat

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

e、 g: 在使用诸如“stackOverflow”.time()之类的键设置多个值之后,我希望稍后检索与“stackOverflow”模式匹配的所有键

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

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

有什么想法吗


乌德帕特: 谢谢各位。我最终复制了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;
}

这对我来说很有用:)

遗憾的是,目前没有使用通配符返回项目的方法,而且redis不支持存储项目的名称空间

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

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

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

我知道github上有人创建了一个新的存储库,他在其中修改了redis以允许
名称空间
,但这需要您自己从源代码构建redis二进制文件。这将使您无法再通过apt get更新redis版本。这是不可能的,但有一些替代方案

一个想法是保留一套你感兴趣的钥匙。这是解决此问题最常见的方法:每次创建一个以后要检索的键时,都要将其名称添加到集合中。然后,当您需要操作其中一个键时,您可以从集合中抓取它。阅读本书,了解该方法的大致情况

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

最后,一个不推荐但为了完整起见我列出的选项是使用
KEYS
命令收集所需的密钥,然后继续使用
MGET
获取值,如
SCAN
方法。不建议这样做,因为生产环境中不应使用
键。更多关于