实现方式
1.数据库轮询(30)
订单表(订单ID、状态、创建时间) 物理、 逻辑
2.JDK队列 DelayedQueue 无界阻塞队列
poll() 得到超时的元素, 如果没有任何元素超时,返回null
take() 得到超时的元素, 如果没有任何元素超时,阻塞
3.环形队列
环形队列的本质是一个指定长度的数组,数组中每个位置可存放一个任务集合(Set),集合中的元素为任务(Task)。当扫描到数组最后一个元素时,重新从下标0开始下一轮扫描,形成环形队列。
Task结构中有两个非常重要的属性:
1、num:当前第几圈扫描到这个Task时,执行任务;
2、taskId:任务执行的ID。
4.Redis有序集合(可以解决集群)
Redis sortedset集合(sorted set也叫zset)是一个有序集合,每个元素(member)都关联了一个score,可以通过score排序获取集合中的值。
zset常用命令
添加元素:zadd key score member[[score member][score member].…]
按顺序查询元素:zrange key start stop [withscores]
查询元素score:zscore key member
移除元素:zrem key member[member.…]
Redis有序集合
将订单超时时间碳与订单号分别设置为score与member,系统扫描第一个元素判断是否超时。
Redis Set集合
通过Redis的set集合,将订单延迟时间的秒级别时间戳设置为set集合的key,value为订单lD。