7-2使用Redis构建任务队列

目录

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中的操作:

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值