Списки магазинов на Redis

У меня есть список, и я хотел бы кэшировать его в 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(), чтобы получить элементы в цикле. Вы можете это подтвердить?

Я предпочитаю первый подход?

Спасибо вам, ребята

М:)

2 ответа

Причина, по которой второй блок кода медленнее, состоит в том, что он создает hget вызов для каждой итерации цикла. Таким образом, каждая итерация совершает обратную передачу по сети на ваш сервер Redis.

Напротив, первый блок кода не выполняет никаких сетевых вызовов внутри блока цикла. Так что это работает намного быстрее.

Похоже, что вы заинтересованы в кэшировании всего списка, написании и загрузке его каждый раз. В этом случае вы можете просто сохранить все как JSON в строке Redis, чтобы получить максимальную производительность.

Другие вопросы по тегам