Linux每秒定时如何实现不请求数据库的情况下完成任务?

背景介绍:
这个项目是一个微信端的付费问答平台,框架是ThinkPHP。
逻辑和"分答"类似:用户提问了问题“以后房价是什么走势?”,问完问题需要支付相应金额,后台会在24小时内审核问题。审核通过后问题48小时后无人回答就要立刻把用户使用微信支付的钱原路返回去。

现在不太清楚的事情是:

  1. 如何能够监控每个问题时间到48小时马上退款呢?

  2. 如果使用 Linux 定时每秒执行任务,那这个任务也不可能每秒都访问数据库查询看哪个问题快过期吧?

  3. 如果使用 redis 具体应该怎么操作那?

现在的想法是:
在用户提问成功后把问题ID作为数组下标、问题结束时间end_time和回答人数answer写入到 F 缓存(就是一个文件),默认answer值为0;
在48小时内如果有用户回答,就把F缓存取出来然后就把对应的下标问题ID删掉

linux定时器每秒钟访问这个缓存文件?

感激不尽!!!

阅读 3.8k
7 个回答

针对你这个问题,我觉得用场景解决技术的问题会比较恰当,就像12306那样,换种角度去处理,那技术就迎刃而解了。
首先,要精确到秒的问题,用Linux的crontab,每秒去扫表,当量大的话,对服务器性能要求也很高,不建议给自己挖坑,量大,占用内存和CPU,机器扛不住。
其次,是否可以用另外的思路考虑,误差在5-10分钟的到期时间,每隔5-10分钟才去扫描一次,这个大幅度的减少了扫描的次数。因为用户也不会那么在乎精确到秒的资金退回情况,包括现在微信24小时退回,你也不会关注什么时候退回,再说,即使你每秒进行扫描,当量大的话,也是会有很大的延迟,不能实时。
PS:缓存的出现,就是允许数据不用实时地展示。不过,还是针对需求情景,合理的解决。

Linux 的定时任务指的是 crontab ? 貌似只能精确到分钟吧,当然也是可以精确到秒的,就是写法很丑陋。

时间要求上也不需要那么严格吧,这种定时任务的情况,精确到每分钟也可以呀,误差几分钟用户都是可以接受的吧。

提供一个思路

1、半小时跑一个脚本,脚本内容是把接下来 半小时内 要退款的用户的相应记录取出来 从近到远,写到 redis 里面,可以使用 redis 的 list 类型

2、写个脚本 去读 redis 记录,然后判断一下这个用户时间,符合要求的就执行退款逻辑,不符合的就还是放回 list 中

恩,还有很多优化空间。

可以用redis有序集合+列表来实现:

1.用户提问后就把问题ID插入到有序集合中(时间戳作分数),有人回答后就把这个问题从集合中删除
2.然后开一个脚本不停地读集合中符合退款条件的问题ID,并把它写入列表,同时从集合中删除。
3.然后再用一个或多个脚本专门处理列表,进行退款操作

新手上路,请多包涵

为什么一定用linux,用消息队列的延时消息吧

这个功能类似当时我做的拼团,时间到自动检测拼团人数是否完成,然后做相应的操作,1.0时候我使用的是laravel框架的消息队列延时功能,后来2.0我拆分出来,使用swoole的心跳计时器功能来做

用crontab 是不恰当的,业务的问题应该用业务的方式去解决,系统的问题才应该用系统的方式去解决

workerman有个定时器功能,你可以了解一下

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