在Redis上存储列表

时间:2017-05-15 13:51:30

标签: caching redis objectcache

我有一个列表,我想将其缓存到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()方法来获取循环中的项目。你可以确认这个吗?

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

谢谢你们

M:)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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