目录
7-2使用Redis构建任务队列
第1关:先进先出任务队列
1、rpush/lpush命令:rpush(name,values[values…])
2、blpop:blpop(keys, timeout)和 lpop/rpop:lpop(name) 删并返回删除值
3、lpushx/rpushx:lpushx(name,value) 添加
4、linsert命令:linsert(name, where, refvalue, value)) 新增
5、lset:conn.lset(name, index, value) 修改(指定索引号进行修改)
6、lrem:conn.lrem(name, value, num) 删除(指定值进行删除)
7、lindex:lindex(name, index) 取值(根据索引号取值)
第二关:优先级任务队列
zadd
zcard
zrange
zcount
zincrby
zrank
zrem
zremrangebyrank
zscore
zrevrange:
通关代码:
第三关:定时任务队列
返回当前时间的时间戳:
使进程休眠 0.5 秒:
通关代码:
哈希相关的知识以及在python中的操作:
7-2使用Redis构建任务队列
第1关:先进先出任务队列
首先要连接redis
import redis
conn = redis.Redis()
队列:rpush、blpop
下面将用Jupyder测试一些命令
1、rpush/lpush命令:rpush(name,values[values…])
即conn.rpush("队列名",要加入的队列)
rpush:将值(可同时插入多个)插入到列表尾部,保证后插入的在最尾部。
示例:conn.rpush("task:list",1)
2、blpop:blpop(keys, timeout)和 lpop/rpop:lpop(name) 删并返回删除值
即task=conn.blpop("队列名",最长等待时间)
blpop:从列表头部阻塞式的弹出一个值,若列表中没有元素可共弹出时,则阻塞该命令直到超过timeout或发现可弹出元素为止。
示例:task=conn.blpop("task:list",10) conn.blpop(["list10", "list11"], timeout=2)可移除多个
拓展:
conn.llen(name) 获取长度
conn.lrange(name,start,end) 获取指定范围的取值
3、lpushx/rpushx:lpushx(name,value) 添加
往已经有的name的列表的添加元素,没有的话无法创建
示例:conn.lpushx("list10", 10) # 这里list10不存在
print(conn.llen("list10")) # 0
4、linsert命令:linsert(name, where, refvalue, value)) 新增
新增(固定索引号位置插入元素)
name - redis的name where - BEFORE或AFTER
refvalue - 标杆值,即:在它前后插入数据 value - 要插入的数据
示例:
conn.linsert("list2", "before", "11", "00")#往列表中左边第一个出现的元素"11"前插入元素"00"
print(conn.lrange("list2", 0, -1)) # 切片取出值,范围是索引号0-最后一个元素
5、lset:conn.lset(name, index, value) 修改(指定索引号进行修改)
name - redis的name index - list的索引位置 value - 要设置的值
示例:
6、lrem:conn.lrem(name, value, num) 删除(指定值进行删除)
name - redis的name value - 要删除的值
num =0,删除列表中所有的指定值;num>0前到后,num<0后到前
7、lindex:lindex(name, index) 取值(根据索引号取值)
lindex:lindex(name, index) 取值(根据索引号取值)
print(conn.lindex("list1", 0)) # 取出索引号是0的值
第二关:优先级任务队列
这个里面主要设计集合的一些知识,下面集合和有序集合的用法一些总结
zadd
新增zadd(name, list_name, priority) 将成员加入到有序集合中,并确保其在正确的位置上
在name对应的有序集合中添加元素
zcard
获取有序集合元素个数 类似于len,zcard(name)
zrange
获取有序集合的所有元素
r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
按照索引范围获取name对应的有序集合的元素
zcount
zcount(name, min, max)
获取name对应的有序集合中分数 在 [min,max] 之间的个数
zincrby
自增
zincrby(name, value, amount)
自增name对应的有序集合的 name 对应的分数
zrank
获取值的索引号
zrank(name, value)
获取某个值在 name对应的有序集合中的索引(从 0 开始)
更多:
zrevrank(name, value),从大到小排序
zrem
删除–指定值删除
zrem(name, values)
删除name对应的有序集合中值是values的成员
zremrangebyrank
删除–根据排行范围删除,按照索引号来删除
zremrangebyrank(name, min, max)
根据排行范围删除
r.zremrangebyrank("zset3", 0, 1) # 删除有序集合中的索引号是0, 1的元素
print(r.zrange("zset3", 0, -1))
zremrangebyscore(name, min, max)
根据分数范围删除
r.zremrangebyscore("zset3", 11, 22) # 删除有序集合中的分数是11-22的元素
print(r.zrange("zset3", 0, -1))
zscore
获取值对应的分数
zscore(name, value)
获取name对应有序集合中 value 对应的分数
print(r.zscore("zset3", "n27")) # 获取元素n27对应的分数271
zrevrange:
返回有序集合中指定区间内的成员。其中成员的位置按分值递减(从大到小)排列。
可以定义函数来实现如下:
def pop_task():
p=conn.zrevrange("task:priority",0,-1)
#排好优先级别,并且赋值给p
while True:
task=conn.blpop(p,10) #blpop是删除并返回删除值
#将集合里面的值取出来放在task里面
if not task:
continue
return task[1]
通关代码:
import redis
conn = redis.Redis()
# 新建任务队列/改变任务队列优先级
def add_task_list(list_name, priority):
# 请在下面完成要求的功能
#********* Begin *********#
conn.zadd("task:priority",list_name,priority)
#********* End *********#
# 将任务加入队列
def add_task(list_name, task_name):
# 请在下面完成要求的功能
#********* Begin *********#
conn.rpush(list_name,task_name)
#********* End *********#
# 获取一个任务
def pop_task():
# 请在下面完成要求的功能
#********* Begin *********#
p=conn.zrevrange("task:priority",0,-1)#排好优先级别
while True:
task=conn.blpop(p,10)
if not task:
continue
return task[1]
#********* End *********#
第三关:定时任务队列
返回当前时间的时间戳:
time.time()
使进程休眠 0.5 秒:
time.sleep(0.5)
通关代码:
import time
import redis
conn = redis.Redis()
# 添加定时任务
def execute_later(task_name, delay=0):
# 请在下面完成要求的功能
#********* Begin *********#
if delay>0:
conn.zadd("task:delayed",task_name,time.time()+delay)
else:
conn.rpush("task:list",task_name)
#********* End *********#
# 转移可执行任务
def pop_task():
# 请在下面完成要求的功能
#********* Begin *********#
while True:
task=conn.zrange("task:delayed",0,1,withscores=True)
#将有序集合指定区间内的成员取出来,键值二维数组:任务,延迟时间
if not task or task[0][1]>time.time():
#若未取到任务或者任务的执行时间未到
time.sleep(0.01) #则休眠 0.01 秒
continue #然后继续尝试获取第一个任务
task=task[0][0] #获取第一个任务
if conn.zrem("task:delayed",task):
conn.rpush("task:list",task)
#********* End *********#
哈希相关的知识以及在python中的操作: