我有一个列表,我想将其缓存到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:)
答案 0 :(得分:2)
第二个代码块较慢的原因是它对循环的每次迭代进行hget
调用。因此,每次迭代都会使网络往返Redis服务器。
相比之下,第一个代码块不会在循环块内进行任何网络调用。所以它运行得更快。
答案 1 :(得分:1)
您似乎有兴趣缓存整个列表,每次都批量编写和提取。在这种情况下,您可以做的是将整个事物作为JSON存储在Redis字符串中以获得最大性能。