1.增加互斥锁:保证缓存和数据库数据一致性
2.增加消费队列,保证mysql数据的正常保存
This commit is contained in:
83
app/process/GameHotDataQueueConsumer.php
Normal file
83
app/process/GameHotDataQueueConsumer.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\process;
|
||||
|
||||
use app\common\service\GameHotDataRedis;
|
||||
use app\common\service\GameHotDataWriteQueue;
|
||||
use support\Redis;
|
||||
use Throwable;
|
||||
use Workerman\Timer;
|
||||
|
||||
/**
|
||||
* 消费热点缓存回源队列(RPOP 批量),与 HTTP 进程分离以削峰。
|
||||
*/
|
||||
class GameHotDataQueueConsumer
|
||||
{
|
||||
public function onWorkerStart(): void
|
||||
{
|
||||
$interval = config('game_hot_cache.queue_consumer_tick_seconds', 0.1);
|
||||
if (!is_float($interval) && !is_int($interval)) {
|
||||
$interval = 0.1;
|
||||
}
|
||||
$interval = (float) $interval;
|
||||
if ($interval < 0.02) {
|
||||
$interval = 0.02;
|
||||
}
|
||||
|
||||
Timer::add($interval, static function (): void {
|
||||
if (!GameHotDataWriteQueue::enabled()) {
|
||||
return;
|
||||
}
|
||||
$key = GameHotDataWriteQueue::queueListKey();
|
||||
$batch = config('game_hot_cache.queue_consumer_batch', 80);
|
||||
$n = filter_var($batch, FILTER_VALIDATE_INT);
|
||||
if ($n === false || $n < 1) {
|
||||
$n = 80;
|
||||
}
|
||||
for ($i = 0; $i < $n; $i++) {
|
||||
try {
|
||||
$raw = Redis::rPop($key);
|
||||
} catch (Throwable) {
|
||||
break;
|
||||
}
|
||||
if ($raw === false || $raw === null || $raw === '') {
|
||||
break;
|
||||
}
|
||||
if (!is_string($raw)) {
|
||||
continue;
|
||||
}
|
||||
$job = json_decode($raw, true);
|
||||
if (!is_array($job)) {
|
||||
continue;
|
||||
}
|
||||
$op = $job['op'] ?? '';
|
||||
if (!is_string($op) || $op === '') {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
if ($op === GameHotDataWriteQueue::OP_USER_REFRESH) {
|
||||
$uid = filter_var($job['id'] ?? null, FILTER_VALIDATE_INT);
|
||||
if ($uid !== false && $uid > 0) {
|
||||
GameHotDataRedis::userReplaceCacheFromDb($uid);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($op === GameHotDataWriteQueue::OP_GC_REFRESH) {
|
||||
$k = $job['key'] ?? '';
|
||||
if (is_string($k) && $k !== '') {
|
||||
GameHotDataRedis::gameConfigReplaceFromDb($k);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($op === GameHotDataWriteQueue::OP_GR_SYNC) {
|
||||
$rid = filter_var($job['id'] ?? null, FILTER_VALIDATE_INT);
|
||||
GameHotDataRedis::gameRecordSyncCachesAfterDbWrite($rid === false ? null : $rid);
|
||||
}
|
||||
} catch (Throwable) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user