Автор оригинала: David Wong.
Ссылка на исходный текст: Блог Хэ Сяодуна
Если у вас нет хорошего представления о нескольких вариантах, вы можете сначала ознакомиться с другими вариантами в Расширенном чтении, которое обсуждается в сообществе laravel China.
Проверка времени и просроченных неоплаченных заказов с помощью таймера swoole и redis Zset
Исходящие из требования: Решение проблемы истечения срока действия неоплаченных заказов в течение 30 минут до недействительного состояния.
最常规简单的解决方案:在服务器上,跑一个定时任务,去数据表中查询数据,查到未支付的订单,обновление 一下这些数据的状态, эти данные также могут быть сохранены в Redis, примерно одинаково. Когда объем данных невелик и сервер не испытывает большого давления, эти схемы не будут выделять преимущества и недостатки, какую из них использовать и какую использовать.
Другой вариант: Раздел хранения: С помощью redis Установите упорядоченный набор, когда будет сгенерирован заказ, zadd заказывает метку времени orderid Сохраните идентификатор заказа в соответствующем В наборе заказов отметка времени используется в качестве его оценки. Часть хранения выглядит так. Это просто + занимает очень мало памяти. Прочитайте раздел: Когда начнется учеба, установите таймер, чтобы считывать данные до заданного времени каждую минуту в установленном порядке. Для удобства тестирования пользователи настраиваются на считывание данных с первой минуты до первых 30 минут. После получения данных обработайте данные в соответствии с бизнес-логикой, а затем zrem заказывает идентификатор заказа Команда удаляет соответствующий Заказ из коллекции. Лично я считаю, что эта схема представляет собой сочетание использования памяти и эффективности. Код выглядит следующим образом:
приказ. php
set(
[
'enable_coroutine' => true
]
);
$server->on('workerStart', function ($server, $workerId) {
$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
// tick is a timer for continuous triggering
swoole_timer_tick(10000, function() use ($redis) {
$upperLimitTime = strtotime('-1 minute');
$lowerLimitTime = strtotime('-30 minute');
Echo's upper limit time:'. $upperLimitTime.'Lower limit time:'. $lowerLimitTime;
$result = $redis->zrangebyscore('orders', $lowerLimitTime, $upperLimitTime);
var_dump($result);
// Business processing is done according to the ID queried, and then zrem orders order ID removes the order ID that successfully handled
});
});
$server->on('message', function (swoole_websocket_server $server, $request) {
$server->push($request->fd, "hello");
});
$server->start();Процесс тестирования: php order.php Откройте прослушиватель swoole, а затем запустите новый терминал, который непрерывно записывает новые данные в их неупорядоченный набор. Эффект заключается в следующем:
Расширенное чтение:
- Документ Swoole_timer_tick
- Статьи по теме о laravel Китай
Продолжайте продвигать несколько блюд и поешьте – > Идите и посмотрите.
Оригинал: “https://developpaper.com/use-swoole-timer-to-change-the-status-of-overtime-unpaid-orders/”