商品自动如何上架?

现在有这样一个需求,就是后台发布商品,不是立即上架,而是设定一个时间,到时间自动上架!

我现在有两种想法。

第一种方法:后台发布商品时,把设定上架的时间转换为unix time,比如:1559192131

然后,再用zadd写入到redis中

$key = 'auto:publish';
$time = 1559192131;
$data = [
  'goodsId' => 1,
  'expire' => 1559195131,
];
$redis->zAdd($key, $time, json_encode($data));

然后,用swoole起一个定时任务
从zset中拿第一条数据,再对比时间是否达到自动发布的条件!
如果自动发布了,就把第一条删除!

第二种方法:就是直接向redis写入list数据

$redis->rPush($key, json_encode($data));

然后用swoole定时的去消费这个list

$data = $redis->lPop($key);

如果到了上架时间,就上架,如果没到,再把数据写到list中!

我感觉这两种方法都不是太好,大神们有没有更好的解决办法?

阅读 5.8k
9 个回答

其实楼上答案我觉得都可以实现,但是你可以换思路,比如商品在加入数据库的时候就有个设置,例如,status = 1是正常发布的商品,status =2 是定时上线下线的商品,这个时候就要判断现在是不是可以展示的商品了,
sql 如

select * from goods where status =1
union all
select * from goods where status =2 and online_time >= XXXX and offline_time<XXX

加个where就行了啊。

后台配置一个上架时间
下架,online_time = 0
立即上架,online_time = time()
未来上架,online_time > time()

$sql = 'select * from goods where online_time  > 0 and online_time <= ' . time();

可以简单点呀。
上架,下架是一种状态。加个发布时间字段。
起一个定时任务,看看这这条数据是否到达发布时间,是则更改状态,否则不处理

swoole不就支持秒级的定时任务 ··· 不需要redis吧

新手上路,请多包涵

这种 目前来说,简单有效的方案似乎是 crontab 了

上架也可以是一种组合状态。
由上架时间 & 上架状态(T => 已上架,F => 下架,D => 待上架,A => 自动上架)组成
(到上架时间 && A) || T

每个商品的上架时间都不同,还是某一批商品同一时间上架?
如果是后者,可以以“publish_time:goods_ids”的形式存起来。

推荐使用消息队列而不是简单的list或发布订阅功能。

推荐楼主的第一种方法,在定时处理逻辑这里尽量避免去查询数据库,另外存储的时候,json_encode这里直接换成goods_id就可以了吧,没有必要再存储一次时间了,score为发布时间

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题