0

我有一个列表,我想将它缓存到 redis 中。我尝试了两种使用哈希的方法来实现它。

考虑第一种方法。我只创建一个哈希并将项目设置为哈希值:

// ..

$apiArray = [..]; // array from parsing an api

if(!$c->keys('lista')){
    foreach (json_decode($apiArray) as $item){
        $c->hset('lista', $item->id, serialize($item));
    }
}

foreach ($c->hgetall('lista') as $key){

    $item = unserialize($key);

    echo '<p>';
    echo '<strong>id</strong>: '.$item->id.'<br>';
    echo '<strong>name</strong>: '.$item->name.'<br>';
    echo '<strong>email</strong>: '.$item->email.'<br>';
    echo '</p>';
}

要循环超过 10000 个项目,需要0.5 秒

现在考虑这个。原始数组的每个元素上的单个哈希:

if(!$c->keys('lista:*')){
    foreach (json_decode($apiArray) as $item){
        $c->hset('lista:'.$item->id, 'element', serialize($item));
    }
}

foreach ($c->keys('lista:*') as $item) {
    $item = unserialize($c->hget($item, 'element'));

    echo '<p>';
    echo '<strong>id</strong>: '.$item->id.'<br>';
    echo '<strong>name</strong>: '.$item->name.'<br>';
    echo '<strong>email</strong>: '.$item->email.'<br>';
    echo '</p>';
}

10000 条记录的循环需要3 秒

这让我很惊讶,因为第二种是Redis官方文档中介绍的方法,它也支持二级索引(通过使用zadd和sadd)。

为什么比第一种方法最慢?我有什么不对吗?

我认为这可能会发生,因为我必须调用 10000 次 hgetall() 方法来获取循环中的项目。你能确认一下吗?

我是否更喜欢第一种方法?

感谢你们

米:)

4

2 回答 2

2

第二个代码块较慢的原因是它对hget循环的每次迭代进行调用。因此,每次迭代都会对您的 Redis 服务器进行一次网络往返。

相比之下,第一个代码块不会在循环块内进行任何网络调用。所以它运行得更快。

于 2017-05-15T16:47:03.910 回答
1

您似乎有兴趣缓存整个列表,每次都批量写入和获取。在这种情况下,您可以做的就是将整个内容作为 JSON 存储在 Redis 字符串中以获得最大性能。

于 2017-06-06T23:06:42.817 回答