Redis queue简单封装

基于Redis的MessageQueue队列封装 Redis的链表List可以用来做链表,高并发的特性非常适合做分布式的并行消息传递。 项目地址:https://github.com/huyanping/Zebra-PHP-Framework 阅读详情

The following article shows how to use redis to build a simple multi-producer, multi-consumer Queue with an interface similar to the python standardlib queue. With this queue you can easily share data between multiple processes or offload time consumig calculations to multiple worker processes.

To store the data we use the redis list data type. Redis Lists stores simple strings sorted by insertion order.

The following redis commands are used:

  • rpush Insert an element at the tail of the list
  • blpop Get an element from the head of the list, block if list is empty
  • lpop Get an element from the head of the list, return nothing list is empty
  • llen Return the length of the list

The implementation uses the redis-py library to talk to the server.

import redis

class RedisQueue(object):
    """Simple Queue with Redis Backend"""
    def __init__(self, name, namespace='queue', **redis_kwargs):
        """The default connection parameters are: host='localhost', port=6379, db=0"""
       self.__db= redis.Redis(**redis_kwargs)
       self.key = '%s:%s' %(namespace, name)

    def qsize(self):
        """Return the approximate size of the queue."""
        return self.__db.llen(self.key)

    def empty(self):
        """Return True if the queue is empty, False otherwise."""
        return self.qsize() == 0

    def put(self, item):
        """Put item into the queue."""
        self.__db.rpush(self.key, item)

    def get(self, block=True, timeout=None):
        """Remove and return an item from the queue. 

        If optional args block is true and timeout is None (the default), block
        if necessary until an item is available."""
        if block:
            item = self.__db.blpop(self.key, timeout=timeout)
        else:
            item = self.__db.lpop(self.key)

        if item:
            item = item[1]
        return item

    def get_nowait(self):
        """Equivalent to get(False)."""
        return self.get(False)

Usage:

>>> from RedisQueue import RedisQueue
>>> q = RedisQueue('test')
>>> q.put('hello world')


Now if we have a look at the redis database with the redis-cli client it shows the expected results:

redis 127.0.0.1:6379> keys *
1) "queue:test"
redis 127.0.0.1:6379> type queue:test
list
redis 127.0.0.1:6379> llen queue:test
(integer) 1
redis 127.0.0.1:6379> lrange queue:test 0 1
1) "hello world"

We can get the item from a different script with:

>>> from RedisQueue import RedisQueue
>>> q = RedisQueue('test')
>>> q.get()
'hello world'

A subsequent call of q.get() will block until anotherone puts a new item into the Queue.

The next step would be to an endoder/decoder (e.g python-json) to the Queue so that you are not limited to send strings.

There alredy exists the nice and simple hotqueue library which has the same interface as the above example and provides encoding/decoding.

Other mentionable queue implementations with a redis backend are:

  • flask-redis A basic Message Queue with Redis for flask.
  • celery An asynchronous task queue/job queue based on distributed message passing. Much more advanced. Can be used with different storage backends.
  • rq Simple python library for queueing jobs and processing them in the background with workers.
  • resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later. Used at github. Includes a nice monitoring web interface.
  • pyres A resque clone in python.
  • 原网页:http://peter-hoffmann.com/2012/python-simple-queue-redis-queue.html
scrapy-redis简单配置详解 注意: 该篇文章为转载内容,此处只是为了巩固一下scrapy-redis的注意事项,scrapy-redis 现已在公司项目中稳稳当当的运行了, 可以查看该篇文章: http://xudailong.gitee.io/2018/01/09/python_crawl_words/ 由于Scrapy_redis已经为封装了大部分的流程,所以使用它不会有任何难度。1.启动Redis首先需要把... 阅读详情

相关推荐

基于workerman的redis-queue实现异步邮件队列

实验场景:页面被客户访问发送邮件通知到我的邮箱,该场景只是为了测试,下单发送邮件或者短信的场景都是一样的,为了体现出来队列的优越性,我自己封装了个邮件发送的接口,接口内部实现增加了sleep(5),纯粹是为了给接口增加耗时,更好的达标实验效果。 workerman的redis-queue地址: https://github.com/walkor/redis-queue 自己封装的邮件发送接口...

php菜鸟博客 870

Redis Queue(rq)

参考文献:http://python-rq.org/ Redis Queue 是一个轻量级的python 库,用于将任务放入到队列将,并在后台异步执行。Redis Queue依赖Redis ,且Redis 的版本要求>=3.0.0 1.基本概念与基础对象 1.1 worker rq worker 就是python 进程,主要任务是从执行长时间、或是阻塞任务。 1.1.1 启动worker ...

随心的专栏 6777

用Redis做一个简单的消息队列

用Redis做的一个简单的消息队列

FullStackPython 项目解析:Redis Queue (RQ) 异步任务队列详解

Redis Queue (简称 RQ) 是一个基于 Redis 的轻量级 Python 任务队列系统,专门用于处理 HTTP 请求-响应周期之外的后台任务。它采用简单直观的设计理念,让开发者能够轻松地将耗时操作(如数据处理、邮件发送、API 调用等)从主线程中剥离出来,显著提升 Web 应用的响应速度和吞吐量。 ## RQ 的核心特性 1. **极简设计**:RQ 的 API 设计非常简洁,学

gitblog_01184的博客 486

STM32超声波避障小车硬件设计与实时测距实现

超声波测距是嵌入式系统中经典的环境感知技术,其原理基于声波在空气中的传播时间与距离的线性关系,通过精确计时实现非接触式距离测量。该技术具备成本低、抗光干扰强、算法简洁等优势,广泛应用于智能小车、机器人避障、液位监测等场景。工程落地的关键在于硬件信号完整性(如5V/3.3V电平匹配)、微秒级定时精度(依赖高稳定外部晶振与输入捕获模式)以及强干扰环境下的数据鲁棒性(需软硬协同滤波)。本文以STM32F103C8T6为平台,深入解析HC-SR04模块的时序闭环控制、TIM3输入捕获双沿测量、L298N电机状态机驱

weixin_42578963的博客 295

流媒体弱网优化之路(NACK)——纯NACK方案的优化探索

流媒体学习之路(NACK)——纯NACK方案的最高性能 文章目录流媒体学习之路(NACK)——纯NACK方案的最高性能一、NACK简介二、Nack的理解2.1 一种补救策略2.2 什么时候要?2.3 要多少?2.4 怎么要?三、计算分析3.1 rtt强相关3.2 补包次数计算3.3 Nack的定时发送3.4 nack重传限制四、实验   近期在针对纯丢包场景做一些简单的探索实验,一个让我困扰的问题就是:不使用FEC而只是通过纯NACK进行补偿,到底能在实验环境下抵抗多少的丢包呢?每一次丢包补偿的最大时长

qw225967的博客 1万+

Redis / python 实现消息队列的几种方案+步骤

目录 思考角度1:用Python原生数据类型 方法1:Queue类型【先进先出】 思考角度2:用redis,目前有4种方法 方法1:基于List的 L(R)PUSH+L(R)POP 的实现 方法2 :订阅/发布模式,原生的PUB/SUB,频道订阅 方法3:生产消费模式(不推荐) 方法4: 基于Sorted-Set的实现,有序集合,类似于list 什么是消息队列??本质就是一个有序列表,有人放,有人拿 思考角度1:用Python原生数据类型 方法1:Queue类型【先进先出】 ...

仲羊的博客 3960

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 710

python 操作redis 消息队列

连接到Redis:在你的代码中,你需要使用适当的Redis客户端库连接到Redis数据库。在使用Redis的消息队列时,当订阅者接收到消息后,消息的类型取决于所使用的Redis客户端库。请注意,在不同的编程语言和Redis客户端库中,具体的方法调用可能会有所不同,但基本思想是一致的。因此,在实际使用过程中,请查阅所使用Redis客户端库的文档,并根据需要进行相应的转换操作。当订阅者接收到消息时,可以根据约定好的序列化方法对消息进行反序列化,以读取字典类型的数据。1 使用JSON序列化。

xiaoxiaodechongzi的博客 1636

allegro 约束管理Constraint Manager(一)

介绍Cadence allegro 约束管理器CM的使用方法。

weixin_38975819的博客 8716

ICLR 2022)ODConv:即插即用的动态卷积 (附代码)

一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度动态卷积。ODConv是一种动态卷积算法,它的原理是在卷积过程中,根据输入数据的特征动态地调整卷积核的形状和大小,以适应不同的输入数据。具体来说,ODConv通过引入一个可学习的形变模块,根据输入数据的特征动态地调整卷积核的形状和大小,从而提高了卷积神经网络的性能。此外,相比常规卷积,动态卷积的卷积核参数往往是其n倍。

PLANTTHESON的博客 2万+

Python实战:Redis缓存与消息队列

本文将深入探讨Python中使用Redis进行缓存与消息队列的方法。我们将从基础开始,逐步深入,包括Redis的安装、连接、数据缓存、消息队列的实现、分布式锁、事务处理等。

oandy0的博客 1158

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

蚂蚁男孩.队列组件(Framework.Mayiboy.Queue)

它能做什么   主要是用来方便使用队列而诞生,该组件封装了Queue和Redis中的队列,能够通过简单配置就可以高效快速使用起来。 使用说明 一、下载源码,自己手动编译,手动引用必要的程序集。(需要手动创建配置文件) 二、通过NuGet安装Packages1、在程序包管理器控制台中输入Install-Package Framework.Mayib...

ansui0780的博客 241

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出,其理念是创建一种适用于图的高效卷积神经网络。在本节中,我们将讨论 Vanilla GNN 架构的局限性,并详细介绍 GCN 的工作原理,通过使用 PyTorch Geometric 在 Cora 和 Facebook Page-Page 数据集上实现 GCN 来验证其性能。

盼小辉丶的博客 2万+

【python爬虫--爬取电商商品及对其销量、好差评等数据进行分析】Python爬虫爬取电商商品及大数据分析-实战

选择目标电商网站:这里选择爬取两个不同电商网站(比如京东、淘宝)上的商品数据,包括商品名称、价格、销量和评价信息。编写爬虫:通过爬虫获取商品信息并保存数据。数据清洗与对齐:将两个电商网站抓取到的数据进行统一清洗和对齐。数据分析:进行销量分析、好评与差评分析等。

Dreams°的博客 4013

Thinkphp6 think-queue redis 封装队列任务类

配置文件queue.php <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2016 http://t

qq_32421489的博客 836

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

docker构建redis,以及Python连接redis封装

docker容器化启动redis # 拉取最新镜像镜像 docker pull redis:latest # 容器启动命令 docker run -d --restart=on-failure:5 \ --name=redis -p 7731:6379 \ -v D:\workspace\docker-data\redis\data:/data \ -e TZ="Asia/Shanghai" \ redis:latest \ redis-server --appendonly

weixin_37128372的博客 588

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ML-For-Beginners 时间序列预测实战:用 ARIMA/SARIMA 模型预测电力负荷数据

本篇技术指南聚焦 ML-For-Beginners 课程库 [7-TimeSeries/2-ARIMA](https://link.gitcode.com/i/8cc8d25886924658907d7cb66b2f7880) 一课的完整知识体系:从平稳性、差分等时间序列核心概念入手,逐步讲解如何用 `statsmodels` 的 `SARIMAX` 为小时级电力负荷数据(GEFCom 2014)

gitblog_00195的博客 904

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

利用Queue实现的Flask下的资源池

最近在开发flask网站程序的时候,遇到一个资源竟态分配的问题,尝试使用python中的Queue来解决 1 业务场景 在我们的业务中,我们提供了很多台设备可以供用户链接使用,用户通过接口来申请设备使用,在数据库中维护了设备的状态,可用、忙碌和不可用,分配的策略是从数据库中取出可用的设备列表,然后通过调用一个测试链接函数来确认是否实际可用,如果确实可用则把该设备标记为忙碌,然后把设备信息返...

邱孝兵的博客 3927

redis php异步队列,基于workerman的redis-queue实现异步邮件队列

实验场景:页面被客户访问发送邮件通知到我的邮箱,该场景只是为了测试,下单发送邮件或者短信的场景都是一样的,为了体现出来队列的优越性,我自己封装了个邮件发送的接口,接口内部实现增加了sleep(5),纯粹是为了给接口增加耗时,更好的达标实验效果。workerman的redis-queue地址:自己封装的邮件发送接口地址:如果在页面里面直接调用发送邮件接口的话,页面需要等待5秒才能加载出来。代码实现如...

weixin_33364627的博客 920

java jedis 封装_谁有好用的Java使用redis的封装的示例?

Java连接redis的使用示例Redis是开源的key-value存储工具,redis通常用来存储结构化的数据,因为redis的key可以包含String、hash、listset和sorted list。Redisclient支持多种语言,包括:c、C++、C#、php、java、python、go等语言,根据自己的开发语言,选择合适的redis client版本类型即可。我是使用java语言...

weixin_32602775的博客 135

Redis?它主要用来什么的

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。大多数小伙伴都知道,Redi

野蛮女孩的博客 16万+

php队列封装,PHP实现基于Redis的MessageQueue队列封装操作示例

本文实例讲述了PHP实现基于Redis的MessageQueue队列封装操作。分享给大家供大家参考,具体如下:Redis的链表List可以用来做链表,高并发的特性非常适合做分布式的并行消息传递。项目地址:https://github.com/huyanping/Zebra-PHP-Framework左进右出$redis->lPush($key, $value);$redis->rPop...

weixin_35826166的博客 287

redis分布式锁实现---基于redisson封装自己的分布式锁

一、介绍 对于使用Redis做分布式锁的简单实现,在上篇我们已经介绍了如何通过Redis命令 + lua脚本来一步步的实现一个简单的分布式锁。并且对于每种实现方案的优缺点进行了逐一分析。其实这些缺陷也是Redis做分布式锁的常见缺点。 在生产上我们一般不会自己从头开始去实现一个分布式锁,毕竟需要考虑的问题以及成本太高了。好在已经有很多框架帮我们实现好了各种分布式锁(比如Redisson),一般来说在我们自己的产品中只需要将redisson提供的相关功能进行封装,提供一些动态配置项来适配redisson提供的

wenpan的博客 2310

Nestjs框架: nestjs-bull的使用与相关queue的规划

摘要: NestJS定时任务在处理大量高并发或秒级任务时存在内存占用问题,推荐使用基于Redis的队列方案nestjs-bull。该方案支持生产者、消费者和监听者模式,适用于多种场景(如邮件、数据处理、订单处理等)。配置时需设置Redis连接参数(单节点或哨兵模式),并通过BullModule动态注册队列。任务支持延迟执行、优先级、重试策略等高级选项。示例展示了如何创建队列、添加任务(如延迟发送邮件)及编写消费者逻辑,使用dayjs处理时间计算。该方案优化了任务调度效率,适合复杂业务场景。

Wang的专栏 1279
上一篇: ubuntu 建立samba共享目录
下一篇: django orm基本使用策略
youbo_sun
博客等级 码龄12年 20粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值