任务开始时间这些状态是如何修改的?

现在遇到过很多时间段任务(秒杀或拼团)的设计,然后这些任务都会存在状态:待开始,进行中,已结束
刚创建的时候是待开始的状态,然后要判断活动开始时间是否到了,如果时间符合就要将状态改为进行中。结束时间也是这样。
我自己想到的方法是:

  1. 后台定时任务扫一遍(可能存在不及时的情况)
  2. 查询任务的时候根据任务开始时间和结束时间动态生成状态(数据表会存在没有状态的情况)

还有什么优雅的做法吗?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9

不太理解你的意思, 任务这种东西你刚创建的时候 就是 待开始 状态. 有操作按钮手动 将任务置为 进行中 或者 结束

3年前 评论

@ouer1994 这些比如拼团活动或秒杀活动,创建的时候可能是下周的时间开始秒杀,然后这个状态就要从待开始转进行中。手动应该不大可能。

3年前 评论
ouer1994 3年前
梧桐树下 (作者) (楼主) 3年前

应该有一个设置一个开始的时间,然后根据当前时间动态返回状态。

3年前 评论
梧桐树下 (楼主) 3年前

2就是正确的做法,为什么会存在没有状态

3年前 评论
梧桐树下 (楼主) 3年前

伪代码

if($request->has('seckill_status')) {
    switch($request->seckill_status) {
        case 'pending': //待开始
            $query->where('start_at', '>', now());
            break;
        case 'progressing': //进行中
            $query->where('start_at', '<=', now())->where('end_at', '>=', now());
            break;
    }
}

这样不就行了

3年前 评论
梧桐树下 (楼主) 3年前
Order 模型

public function getStatus()
{
if( $this->end_time <= time())  // 结束
        return 4;
if( $this->end_time ....) // 进行中
   return 2;

return 1;  // 已开始
}

$orders = Order::All();
$orders->map(function($order){  $order->status = $order->getStatus() });
return $orders;

不需要数据库有状态, 每次手动查询返回一个 status 属性。

性能会不会不好? 问这个就是白眼。

3年前 评论
梧桐树下 (楼主) 3年前

数据库设置status字段,标示当前商品的状态. 在商品进行时间范围内异步事件处理,修改数据status为进行中. 定时脚本查询将已结结束的商品状态修改为结束.

3年前 评论
梧桐树下 (楼主) 3年前
xxx (作者) 3年前
梧桐树下 (楼主) 3年前
AloneUtopia

个人觉得这种还是应该直接通过开始时间 和 结束时间等来判断活动的具体状态;

如果是通过特定的状态字段来表示活动的状态,那么对该字段的维护则会变得较为复杂,且不可靠性(可能会出现不及时、失败等情况)

3年前 评论
梧桐树下 (楼主) 3年前
fffswhk 3年前
梧桐树下 (楼主) 3年前
AloneUtopia (作者) 3年前

我闲着无聊来的,没仔细看,我觉得可以用 Redis + mysql 做呀。 判断订单状态开始可以用 cron 每分钟扫当前时间是否开始(取每次离现在最近的某个活动的开始时间,不要取所有的),活动开始了,页面肯定有人点抢购,抢购成功 Redis 设置哈希 或 key value 等形式的结果 NUM = NUM + 1,设置100个卖光了后者抢光了, REDIS里面那个值 NUM == 100,再执行SQL 修改订单状态为已结束,顺便把结束时间设置比当前时间小。PS:没仔细看题目,我闲着无聊瞎几把乱说的。。。

3年前 评论
梧桐树下 (楼主) 3年前

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