我有一个列表,我想将它缓存到 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() 方法来获取循环中的项目。你能确认一下吗?
我是否更喜欢第一种方法?
感谢你们
米:)