关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

先说问题,之前是通过计划任务来实现,最新一期大乐透随机注数是否中奖
结果上周五我自己随机了4w多注来看看可不可以中一等奖
不出意外的出现意外了
因为是循环匹配导致了请求超时直接504了
因为这块太耗时了,所以今天我改成了队列形式然后加分块查询来处理这块,不知道还有没有什么好的办法
然后队列的最大重试次数是3次
超时时间设置的600秒
大乐透随机注数地址:www.xiaocai.ink/randLottery

这是对比的代码

关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

这是队列处理逻辑
关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

这是计划任务,把任务推送到队列中去

关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

注数中奖处理完之后,会生成一条统计结果

关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

这是开奖结果表
关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

这是随机注数表数据

关于我博客的大乐透模块,随机注数42170条数据匹配官方中奖的这件事

猪猪
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 46

看标题还以为随机出来的号码中奖了 :unamused:

5个月前 评论
猪猪 (楼主) 5个月前

你这种最好是用 SSE 来返回数据,就是生成一个组合,返回一个组合给前端。

伪代码:

// 创建一个新的 EventSource 对象
var source = new EventSource("path/to/your/server");

// 监听 message 事件
source.onmessage = function(event) {
    // event.data 包含服务器发送的数据
    console.log(event.data);
};
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

class SSEController extends Controller
{
    public function streamData(Request $request)
    {
        // 设置响应头,指定 Content-Type 为 text/event-stream
        $response = new StreamedResponse();
        $response->headers->set('Content-Type', 'text/event-stream');
        $response->headers->set('Cache-Control', 'no-cache');
        $response->headers->set('Connection', 'keep-alive');
        $response->headers->set('X-Accel-Buffering', 'no');

        // 发送初始数据到客户端
        $response->stream(function () {
            echo "data: Initial data\n\n";
            echo "data: Another data\n\n";
            echo "data: More data\n\n";
            echo "event: custom-event\n";
            echo "data: Custom event data\n\n";
            ob_flush();
            flush();

            // 定期发送数据到客户端
            while (true) {
                // 模拟获取数据
                $data = $this->getDataFromSomewhere();

                // 发送数据到客户端
                echo "data: " . json_encode($data) . "\n\n";
                ob_flush();
                flush();

                // 休眠一段时间
                sleep(5);
            }
        });

        return $response;
    }

    private function getDataFromSomewhere()
    {
        // 从某个地方获取数据,可以是数据库、API 等
        // 这里只是一个示例,返回一个随机数
        return ['value' => rand(1, 100)];
    }
}

这样保持 Http 长连接,可以避免等待时间过长出现 504 的情况,参考「Chatgpt」的对话返回数据的方式。

5个月前 评论
MArtian (作者) 5个月前
猪猪 (楼主) 5个月前
MArtian (作者) 5个月前
猪猪 (楼主) 5个月前
MArtian (作者) 5个月前
猪猪 (楼主) 5个月前
FatTiger 5个月前
猪猪 (楼主) 5个月前
FatTiger 4个月前

超级大乐透我中过三等奖

5个月前 评论
猪猪 (楼主) 5个月前
巴啦啦

你把事情做复杂了吧。 将每期号码,按大小排列,做成一个KEY。开奖号码,按大小排列。只查一次就行了。

5个月前 评论
ononl 5个月前
猪猪 (楼主) 5个月前
猪猪 (楼主) 5个月前
xiaofeishu 5个月前
猪猪 (楼主) 5个月前
CodeUndefined 5个月前
猪猪 (楼主) 5个月前
猪猪 (楼主) 5个月前
巴啦啦 (作者) 5个月前
巴啦啦 (作者) 5个月前
巴啦啦 (作者) 5个月前
CodeUndefined 5个月前
猪猪 (楼主) 5个月前
CodeUndefined 5个月前
猪猪 (楼主) 5个月前
猪猪

队列做完没有推送,我才执行了 php artisan queue:work 但是还是没有弄完,还剩2w数据没有开奖,队列一共执行了两次,这是什么原因

5个月前 评论
猪猪 (作者) (楼主) 5个月前

:joy:不懂彩票,随机数搞起
其实可以分成两个job执行:

  • 1.随机生成几组的Job;
  • 2.把每一组丢到第二个job执行(那就是执行生成4W个JOB2)

可以尽量避免了Job超时问题。

5个月前 评论
猪猪 (楼主) 5个月前

循环里更新数据库了吗?每次chunk的时候,把里面循环计算出来中奖level的id写一个数组里,循环完之后批量更新level试试嘞

5个月前 评论
猪猪 (楼主) 5个月前
lun1bz (作者) 5个月前
猪猪 (楼主) 5个月前

思路展开,队列里还可以套队列,存入数据库的分组后,根据组每个一个队列,水平展开,超时也会少,不过条件和数据怎么去分就看你自己的思路了

5个月前 评论
猪猪 (楼主) 5个月前

有没有可能,做一个全的数据,然后随机取ID ?

5个月前 评论

:disappointed:我还以为有人中奖了

5个月前 评论
猪猪 (楼主) 5个月前

原来2.2亿是你随机出来的哈 抓到了

4个月前 评论
猪猪 (楼主) 4个月前
猪猪 (楼主) 4个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!