基于Redis的队列及创建定时任务(redis队列和定时任务)

Redis是相对于Memcached的一种改良版的内存交换数据库,它能用作数据库,缓存和消息队列系统。它比Memcached扩展了一些复杂的存储类型,它支持数据持久化,这对实现可靠性更高的队列来说是必须的,因此Redis在实现队列中是非常方便的。

由于Redis是有序列表的文件形式来存储,因此可以很容易的实现先进先出的队列。它的有序可以让我们改变插入的位置,进行优先级队列和延迟队列应用。在使用Redis做队列时,我们可以使用lpush,rpush指令对Redis内部操作数据,或者使用rpop,lpop取出数据,以一定间隔,我们可以取出队列数据。

同时,使用Redis还可以实现定时任务。Redis有一个特殊的数据类型——sorted set,这种类型中会有一个时间戳属性,我们可以在sorted set中放入任务数据,并设置它的时间戳,当这个时间戳和当前时间相等或小于的时候,我们就可以取出这条任务消息,因此实现定时任务也是可行的。

比如下面这段代码:

import redis
import time

r = redis.Redis(host='localhost',port=6379,db=0)

# 先使用zadd 向sorted set中添加任务
task_name = 'task1'
task_time = time.time() + 30 # 30秒后执行
task_data = b'123456',
ret = r.zadd('tasks', {task_name: task_time, task_data}

# 之后,我们就可以使用zrangebyscore,遍历score在当前时间以前的所有元素
while True:
ret = r.zrangebyscore('tasks', 0, time.time())
if ret:
for item in ret:
data = r.hget('tasks', item)
print('reading data: %s' % data)
r.zrem('tasks', item)
else:
time.sleep(2)

首先我们使用zadd,向sorted set中添加任务,将任务名和任务时间存入,接着使用while循环,通过zrangebyscore每2秒查询一次所有当前时间以前的任务,并取出此任务信息。这样的方法就可以实现定时任务的调度。

Redis提供了一个方便和高效的队列系统,并可以运用Redis实现定时任务。最重要的是,它实现可靠性更高,数据也容易持久化,比起Memcached又进一步提升了。


数据运维技术 » 基于Redis的队列及创建定时任务(redis队列和定时任务)