0

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

我现在有两种想法。

第一种方法:后台发布商品时,把设定上架的时间转换为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中!

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

小米粥 219
5月30日提问

查看全部 9 个回答

0

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

推荐答案

3

其实楼上答案我觉得都可以实现,但是你可以换思路,比如商品在加入数据库的时候就有个设置,例如,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

推广链接