Рубрики
Uncategorized

Редис осознает второе убийство

Автор оригинала: David Wong.

Представил

Всем должно быть известно, что запросы на доступ резко возрастут в течение короткого периода времени, при этом, гарантируя, что данные не будут перепроданы и точны, все еще существуют некоторые технические проблемы. К сожалению, шансов на реализацию в проекте не было. Прочитав еще немного информации, я планирую поэкспериментировать. Следующий код используется только для Тестирования Среда относительно проста. Пожалуйста, измените его в соответствии с реальной ситуацией.

Создайте вторую очередь убийств

Перед началом второго убийства поставьте товар в очередь следующим образом

/**
     * Create a second kill list
     */
    public function createList()
    {
        $count = 30;
        $redisKey = 'goods_list';

        for ($i = 1; $i <= $count; $i++) {

            // Test to prevent data errors
            if (Redis::llen($redisKey) >= $count) {
                break;
            }

            Redis::rpush($redisKey, $i);
        }
    }

После выполнения, посмотрите на это красным цветом

Существует 30 товарных идентификаторов с обычными данными.

Шип

Следующим ключевым шагом является использование Redis lpop Команда получает идентификатор товара, используя атомарность Redis.

/**
     * spike
     */
    public function buy()
    {
        // Random username, meaningless, tagged only
        $username = Hash::make(now());

        if ($goodsId = Redis::lpop('goods_list')) {
            // Successful Purchase
            Redis::hset('buy_success', $goodsId, $username);
        } else {
            // Failure to buy
            Redis::incr('buy_fail');
        }
    }

Как упоминалось выше, код упрощен. После покупки успех только фиксируется. В практическом применении, конечно, это будет сложнее, но следует отметить, что Mysql не работает синхронно. Еще одно слово, Хэш:сделать(сейчас()) Даже если значения будут одинаковыми, одни и те же данные не будут сгенерированы, см. Здесь.

тест

Наконец, протестируйте его, используйте тест b, выполните его. abc 300 -n 3000 http://localhost/buy/ Вышеуказанный заказ означает 300 одновременных запросов в течение 3000 раз

Выполнение было не быстрым, и 794 обращения завершились неудачно. Давайте посмотрим, верны ли эти данные. Печать на странице buy_success значение

Тридцать победителей. Посмотрите на количество неудачных попыток второго убийства

Не точное число, 2165 + 30-это количество успешных запросов, плюс 794 сбоя, всего 2989, все еще меньше 3000.

эпилог

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

Ссылка: Redis реализует высокий параллелизм оснастки, функции второго убийства, дизайнерские идеи облачной собственной системы второго убийства, дизайн архитектуры второго убийства