[java]-超时自动处理

实现方式

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,系统扫描第一个元素判断是否超时。

image-20220118002653489

Redis Set集合
通过Redis的set集合,将订单延迟时间的秒级别时间戳设置为set集合的key,value为订单lD。
image-20220118010701451

posted on 2023-03-08 12:43  共感的艺术  阅读(63)  评论(0编辑  收藏  举报