redis实现延迟任务
实现思路:
发布时间:立即发布、未来要发布
list存立即发布,redis中的list是双向链表,方便添加查找性能较高。
zset可以去重、排序,存储未来要发布的。
为什么要把任务存储到数据库中?
延迟任务是一个通用的服务,任何有延迟需求的任务都可以调用该服务,内存数据库的存储是有限的,需要考虑数据持久化的问题,存储数据库中是一种数据安全的考虑。
为什么使用redis中的两种数据类型,list和zset?
原因一:list存储立即执行的任务,zset存储未来的数据
原因二:任务量过大以后,zset的性能会下降
时间复杂度:执行时间(次数)随着数据规模增长的变化趋势
操作redis中的list命令LPUSH:时间复杂度: O(1),常量级复杂度,执行次数与数据规模无关
操作redis中的zset命令zadd:时间复杂度:O(M*log(n)),对数级复杂度,执行次数与数据规模是对数关系
在添加zset数据的时候,为什么需要预加载?
如果任务数据特别大,为了防止阻塞,只需要把未来几分钟要执行的数据存入缓存即可,是一种优化的形式