redis队列
redis 做消息队列的特性例如 FIFO(先进先出)很容易实现,只需要一个 list 对象从头取数据,从尾部塞数据
(1)左侧入右侧出:lpush/rpop;
(2)右侧入左侧出:rpush/lpop。
这个简单的消息队列很容易实现
Zset 有序集合
有些任务场景,并不需要任务立刻执行,而是需要延迟执行;有些任务很重要,需要在任务失败的时候重新尝试。这些功能仅仅依靠 list 是无法完成的。这个时候,就需要 redis 的有序集合。
Redis 有序集合和 Redis 集合类似,是不包含相同字符串的合集。它们的差别是,每个有序集合的成员都关联着一个评分 score,这个评分用于把有序集合中的成员按最低分到最高分排列。
单看有序集合和延迟任务并无关系,但是可以将有序集合的评分 score 设置为延时任务开启的时间,之后轮询这个有序集合,将到期的任务拿出来进行处理,这样就实现了延迟任务的功能。
对于重要的需要重试的任务,在任务执行之前,会将该任务放入有序集合中,设置任务最长的执行时间。若任务顺利执行完毕,该任务会在有序集合中删除。如果任务没有在规定时间内完成,那么该有序集合的任务将会被重新放入队列中。
(1) ZADD 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数。
(2) ZRANGEBYSCORE 按分数返回一个成员范围的有序集合。
(3) ZREMRANGEBYRANK 在给定的索引之内删除所有成员的有序集合。