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

这篇具有很好参考价值的文章主要介绍了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()

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

 文章来源地址https://www.toymoban.com/news/detail-436838.html

队列:rpush、blpop

下面将用Jupyder测试一些命令

1、rpush/lpush命令:rpush(name,values[values…])

  即conn.rpush("队列名",要加入的队列)

rpush:将值(可同时插入多个)插入到列表尾部,保证后插入的在最尾部。

示例:conn.rpush("task:list",1)

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

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) 获取指定范围的取值

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

 

3、lpushx/rpushx:lpushx(name,value) 添加

往已经有的name的列表的添加元素,没有的话无法创建

示例:conn.lpushx("list10", 10)   # 这里list10不存在

print(conn.llen("list10"))  # 0

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

 

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-最后一个元素

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

5、lset:conn.lset(name, index, value) 修改(指定索引号进行修改)

name - redis的name    index - list的索引位置    value - 要设置的值

示例:

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

 

6、lrem:conn.lrem(name, value, num)  删除(指定值进行删除)

name - redis的name    value - 要删除的值

num =0,删除列表中所有的指定值;num>0前到后,num<0后到前

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

7、lindex:lindex(name, index) 取值(根据索引号取值)

lindex:lindex(name, index) 取值(根据索引号取值)

print(conn.lindex("list1", 0))  # 取出索引号是0的值

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

 

第二关:优先级任务队列

这个里面主要设计集合的一些知识,下面集合和有序集合的用法一些总结

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

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

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

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

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

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

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

 

到了这里,关于7-2使用Redis构建任务队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用redis实现队列功能

    操作 方法 描述 LPUSH Long lPush(String key, String… values) 将一个或多个值 value 插入到列表 key 的表头,返回插入后列表中value的数量,若key不存在,会创建一个新的列表并执行 LPUSH 操作 RPOPLPUSH String rPopLPush(String source, String destination) 列表 source 中的最后一个元素(尾元素)弹出,并返

    2024年02月09日
    浏览(34)
  • 【Redis实战】有MQ为啥不用?用Redis作消息队列!?Redis作消息队列使用方法及底层原理高级进阶

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《Redis实战与进阶》 本专栏纯属为爱发电永久免费!!! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/ 我们用的是云

    2024年02月20日
    浏览(43)
  • PHP使用Redis实战实录5:Redis实现消息队列

    PHP使用Redis实战实录系列 PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案 PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案 PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展 PHP使用Redis实战实录4:单例模式和面向过程操作

    2024年02月11日
    浏览(44)
  • Java使用Redis实现消息队列

    近期刷Java面试题刷到了“如何使用Redis实现消息队列”,解答如下: 一般使用 list 结构作为队列, rpush 生产消息, lpop 消费消息。当 lpop 没有消息的时候,要适当sleep 一会再重试。若不使用sleep,则可以用指令blpop(该指令在没有消息的时候,它会阻塞住直到消息到来) rp

    2024年02月21日
    浏览(45)
  • 使用SpringBoot利用Redis实现消息队列

    随着互联网的发展,消息队列的应用越来越广泛。消息队列可以解决系统之间的异步通信问题,提高系统的可靠性和可扩展性。在Java开发中,Redis作为一种高性能的缓存和消息队列系统,被广泛应用。本文将介绍如何使用SpringBoot中利用Redis实现消息队列。 在Redis中,List是一种

    2024年02月14日
    浏览(31)
  • Redis系列14:使用List实现消息队列

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5:深入分析Cluster 集群模式 追求性能极致:Redis6.0的多线程模型 追求性能极致:客户端缓存带来的革命 Redis系列8:Bitmap实现

    2024年02月07日
    浏览(38)
  • 机器学习任务中使用计算图构建和训练模型的流程

    The goal is to encourage the project team to think more long-term and not judge success solely based on tactical results. This requires a shift in mindset to prioritize strategic thinking and understanding the bigger picture. It involves reevaluating the current perspective and approach to ensure that decisions and actions align with long-term goals and obje

    2024年02月10日
    浏览(38)
  • jenkins 使用webhooks 触发构建任务gitea为例 gitlab类似

    多次尝试以及网上的各种资料查阅成功了下 其他人给的答案他们有他们的道理,至少我没有实验成功。我这里就记录下 添加API token 将生成的token 复制保存 第4步骤的时候要用 配置构建方式 填写身份验证令牌 安全配置修改为 “登录用户可以做任何事” 在gitea 中配置webhooks

    2024年01月25日
    浏览(39)
  • 配置Jenkins的slave agent并使用它完成构建任务

    上一章,使用单机配置并运行了一个简单的maven项目,并发布到了一个服务器上启动。这一章将要配置一个slave agent,并将上一章的job放到agent上执行。我们agent使用的是ssh的方式 准备两台虚拟机: 192.168.233.32(使用用户名+密码方式登录ssh) 192.168.233.34(使用私钥方式登录ss

    2024年02月11日
    浏览(34)
  • Redis入门--头歌实验使用Redis构建支持程序

    Redis 可用于处理业务逻辑,作为系统的一部分。除此之外, Redis 还可以帮助和支持系统的其他部分,例如:用于记录日志,进行数据统计,实现配置自动化以及制作一些有趣的实用小程序等。 本实训将通过构建日志记录组件,统计网页访问数据以及 IP 地址库小工具三个实际

    2024年04月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包