方式一:数据库实现
每条记录都存有时间戳,通过sql筛选出符合时间条件的记录。
方式二:redis的有序集合sort set
步骤:
1.产生消息
用时间戳作为score,使用zadd key score1 value1 命令生产消息
2.读取消息
使用zrangebysocre key min max withscores limit 0 1消费消息最早的一条消息。
3.消费消息并删除
redis 客户端命令
- ZADD key score1 member1 [score2 member2]
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
- ZREM key member [member ...]
方式三:rabbitMQ的死信队列
消息在以下情况下会变成死信息,会被DXL(Dead-Letter-Exchane)死信交换机投递到死信队列:
1.消息被拒绝。
2.消息未被及时消费或者消费了不ack,直接过期。
3.队列达到最大长度。
死信队列的实现:
消息(设置ttl)--->交换机-->队列(消息过期)-->死信交换机-->死信队列-->消费