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

news2024/12/23 13:33:18

目录

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

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用CKKS全同态求近似倒数(近似乘法逆元)

求倒数的算法 两个数互为倒数&#xff0c;是说这两个数乘起来等1.比如a和b互为倒数&#xff0c;那么ab1. 5的倒数是0.2&#xff0c;我们可以很简单的求出来&#xff0c;但是如何在密文域中求一个数的倒数呢&#xff1f; 文章《An investigation of complex operations with …

C#自适应布局

注意事项&#xff1a;不要在Form1中添加任何布局&#xff0c;页面背景不设置图片 步骤&#xff1a; 1、在项目中添加AutoWindowsSize.cs类&#xff0c;内容如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Da…

2.2 掌握 NumPy 矩阵与通用函数

2.2 掌握 NumPy 矩阵与通用函数 2.2.1 创建NumPy矩阵创建NumPy矩阵矩阵的运算矩阵的属性 2.2.2 掌握ufunc函数1、常用的ufunc函数运算2、ufunc函数的广播机制 2.2.1 创建NumPy矩阵 创建NumPy矩阵 1、使用mat函数创建矩阵&#xff1a; matr1 np.mat(“1 2 3;4 5 6;7 8 9”) 2…

casbin轻量级的基于配置的授权框架

简介 Casbin是一个强大的、高效的开源访问控制框架&#xff0c;其权限管理机制支持多种访问控制模型。 Casbin提供了一个执行者 根据提供给执行者的策略和模型文件验证传入的请求。再根据对应的配置授权策略&#xff0c;验证请求判断释放那些行动。 在 Casbin 中, 访问控制模…

由于找不到vcomp140.dll无法继续执行代码,解决方法全攻略

如何解决找不到vcomp140.dll错误&#xff1f;在使用某些软件或者游戏的时候&#xff0c;你可能会遇到下面的错误提示&#xff1a;“由于找不到vcomp140.dll&#xff0c;无法继续执行代码”。这个错误提示通常表示你的电脑缺少一个或多个DLL文件&#xff0c;而这些文件是软件和游…

「字节跳动测试开发面经」一二三面+hr面+超级全资料+复习资料

​ 说在前面&#xff0c;面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&#xff0c;最后没offer&#xff0c;自己只想到几个原因&#xff1a; 1、虚报工资&#xff0c;比实际高30%&#xff1b; 2、有更好的人选&#xff0c;这个可能性不大&am…

【Linux】软件包管理器 yum和编辑器-vim的基本使用

文章目录 一、yum背景知识1.商业生态2.开源生态3.Linux软件生态本土化 二、yum的基本使用1.什么是软件包2.查看软件包3.安装软件4.卸载软件5.rzsz 三、vim的基本使用1.vim的基本概念2.vim的基本操作3.vim命令模式命令集4.vim末(底)行模式命令集5.操作总结 四、简单vim配置1.vim…

C++学习day--10 条件判断、分支

1、if语句 if 语句的三种形态 形态1&#xff1a;如果。。。那么。。。 #include <iostream> using namespace std; int main( void ) { int salary; cout << " 你月薪多少 ?" ; cin >> salary; if (salary < 20000) { cout <&…

浅谈整除分块

例题一 ∑ i 1 n ⌊ n i ⌋ \sum_{i1}^n \lfloor\frac n i\rfloor\\ i1∑n​⌊in​⌋ 首先很容易想到直接求解&#xff0c;对于较大的数据&#xff0c; O ( n ) O(n) O(n)做法无法通过。 注意到函数 y ⌊ n x ⌋ y\lfloor\dfrac n x\rfloor y⌊xn​⌋的图像如下&#xff1a…

Hive语言

一、Hive的DDL语言&#xff08;数据库、数据表的增删改查操作) 二、Hive的DQL语言&#xff08;数据库查询语言&#xff09; 2.1Hive七子句 聚合函数&#xff1a;count()、sum()、max()、min()、avg()可以单独使用。(缩写&#xff1a;cs mm a) 2.1.1 分区查询与分区裁剪 SELEC…

OpenGL(九)——颜色

目录 一、前言 二、简单光源 三、光照场景 3.1 创建光源 3.2 光源顶点着色器 3.3 光源片段着色器 3.4 物体片段着色器 3.5 光源位置 一、前言 我们看到的物体颜色是通过光照在物体&#xff0c;然后反射到人眼成像&#xff0c;具体而言是物体不能吸收的颜色。如白光照射…

C++学习day--09 字符串比较、运算符

1、项目练习 第 1 节 项目需求、项目实现 项目实现&#xff1a; #include <iostream> #include <Windows.h> #include <string> using namespace std; int main( void ) { string name; string pwd; std::cout << " 请输入账号&am…

GPT-4的免费使用方法分享

目录 方法1&#xff1a;使用Ora.sh的LLM应用 方法2&#xff1a;使用https://steamship.com 方法3&#xff1a;使用https://nat.dev 方法4&#xff1a;http://tdchat.vip 方法5&#xff1a;使用Poe网站或App 方法6&#xff1a;使用 Opencat App 方法7:使用https://Huggin…

uniApp实现公农日历相互转换、公历、农历、阳历、阴历、calendar

文章目录 效果图1、组件1.1、html部分1.2、JavaScript部分1.3、style部分 2、使用组件3、总结 效果图 1、组件 1.1、html部分 <template><view v-if"isCalendar" class"calendar_box"><view v-show"!isTime" class"btn_ca…

Linux服务器使用supervisorctl命令部署Java服务详解

我们公司采用supervisorctl命令运行Java -jar包&#xff0c;觉得还是很方便的&#xff0c;此篇文章教你如何使用supervisorctl从零部署Java服务 安装jdk 首先肯定是下载安装Java的运行环境 jdk 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jav…

WindowContainer相关类

WindowContainer类   从WindowContainer类的注释中可以看出该类中定义了一些公共的方法和属性给直接持有窗口的自己或者它的孩子使用&#xff0c;像RootWindowContainer、DisplayContent、DisplayArea、DisplayArea.Tokens、TaskDisplayArea、Task、ActivityRecord、WindowTok…

【话题讨论】-浅谈VR与AR

一、引言 随着ICT基础技术的发展&#xff0c;我们现在社会中的基础ict设施已经逐步完善&#xff0c;从而我们的社会也开始出现科幻片中才会有的场景&#xff0c;比如&#xff1a;我们可以构件一个虚拟3D沙盘。 还有我们熟悉的各类智能眼镜&#xff0c;已经进入到千家万户&…

干货 | Mendeley 的基础使用方法

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 当阅读的文献越来越多&#xff0c;如何整理文献就成了一个大问题。文献管理软件则减轻了我们文献整理的负担。目前的文献管理软件使用较多的有Endnote、Notepress、Mendeley、Zotero等。 …

边无际首发ChatIoT:AI大模型从数字世界向物理世界迈进

将大模型的能力带到物理世界&#xff0c;除了微软、谷歌&#xff0c;还有一家中国的创业公司。边无际作为专注于物联网开发平台研发的科技公司&#xff0c;紧跟AI大模型带来的生产力变革&#xff0c;首发ChatIoT&#xff0c;率先将大模型的技术应用于物联网领域。 在微软、谷歌…

【高并发】网络模式

I/O 多路复用 多线程创建 服务器的主进程负责监听客户的连接&#xff0c;一旦与客户端连接完成&#xff0c;accept() 函数就会返回一个「已连接 Socket」&#xff0c;这时就通过 fork() 函数创建一个子进程&#xff0c;实际上就把父进程所有相关的东西都复制一份&#xff0c;…