Qt应用Redis实现消息队列
类似BS模式,客户端发送任务请求给服务端,服务端将处理结果返回给客户端。 redis负责消息的存储和转发。
仿真病人挂号看病,Patient进程进行挂号,Doctor进程进行看病 ,程序代码如下:
////////////////////////////////////////////Patient////////////////////////////////////////////
Patient.h:
- #include <QObject>
- class QRedis;
- class Patient : public QObject
- {
- Q_OBJECT
- public:
- Patient(QObject *parent = nullptr);
- ~Patient();
- public slots:
- void pushTask(); //push任务
- private:
- void popResult(); //pop结果
- QRedis * m_redis;
- };
Patient.cpp
- #include "patient.h"
- #include "qredis.h"
- #include <QTimer>
- #include <QEventLoop>
- #include <QThread>
- static const QString KEYTASK = "MARKTASK";
- static const QString KEYRESULT = "MARKRESULT";
- Patient::Patient(QObject *parent)
- : QObject(parent)
- {
- //初始化通道
- m_redis = new QRedis(this);
- m_redis->connectHost("127.0.0.1", 6379);
- m_redis->auth("1234");
- qDebug() << "client thread id :" << int(QThread::currentThreadId());
- //轮询任务
- QTimer * timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &Patient::popResult);
- timer->start(20);
- m_redis->del(KEYRESULT);
- m_redis->del(KEYTASK);
- pushTask();
- }
- Patient::~Patient()
- {
- }
- void Patient::pushTask()
- {
- static int i = 0;
- QString task = QStringLiteral("%1号,姓名:%2,状态:%3").arg(++i).arg(QStringLiteral("病人%1").arg(i)).arg(QStringLiteral("挂号"));
- qDebug() <<"========================================================\n\n"<< task;
- qDebug() << "thread id :" << int(QThread::currentThreadId());
- qint64 ret = m_redis->rpush(KEYTASK, task);
- }
- void Patient::popResult()
- {
- QString state;
- QString taskData = m_redis->lpop(KEYRESULT);
- if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
- {
- return;
- }
- QEventLoop loop;
- QTimer::singleShot(5000, &loop, &QEventLoop::quit);
- loop.exec();
- pushTask();
- }
main.cpp
- #include <QtCore/QCoreApplication>
- #include <QDebug>
- #include <QThread>
- #include "patient.h"
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- qDebug() << QString("main thread id = : %1").arg(int(QThread::currentThreadId()));
- QThread patientThread;
- Patient patient;
- patient.moveToThread(&patientThread);
- patientThread.start();
- return a.exec();
- }
/////////////////////////////////////////////////Docktor/////////////////////////////////////////////////
Docktor.h
- #pragma once
- #include <QObject>
- class QRedis;
- class Docktor : public QObject
- {
- Q_OBJECT
- public:
- Docktor(QObject *parent = nullptr);
- ~Docktor();
- public slots:
- void popTask(); //pop任务
- private:
- void pushResult(const QString &task); //push结果
- QRedis * m_redis;
- };
Docktor.cpp
- #include "docktor.h"
- #include "qredis.h"
- #include <QTimer>
- #include <QEventLoop>
- #include <QThread>
- static const QString KEYTASK = "MARKTASK";
- static const QString KEYRESULT = "MARKRESULT";
- Docktor::Docktor(QObject *parent)
- : QObject(parent)
- {
- //初始化通道
- m_redis = new QRedis(this);
- m_redis->connectHost("127.0.0.1", 6379);
- m_redis->auth("1234");
- QTimer * timer = new QTimer(this);
- connect(timer, &QTimer::timeout, this, &Docktor::popTask);
- timer->start(20);
- }
- Docktor::~Docktor()
- {
- }
- void Docktor::popTask()
- {
- //获取任务
- QString taskData = m_redis->lpop(KEYTASK);
- if (taskData.compare("nil", Qt::CaseInsensitive) == 0 || taskData.isEmpty())
- {
- //qDebug() << QString("wait..............................");
- return;
- }
- //处理任务
- pushResult(taskData);
- }
- void Docktor::pushResult(const QString &task)
- {
- QStringList taskDatas = task.split(",");
- QString state = taskDatas.at(2);
- taskDatas.removeLast();
- taskDatas.append(QStringLiteral("状态:看病"));
- //push处理结果
- qDebug() <<"========================================================\n\n" << taskDatas.join(",");
- qDebug() << "thread id :" << int(QThread::currentThreadId());
- qint64 ret = m_redis->rpush(KEYRESULT, taskDatas.join(","));
- }
main.cpp
- #include <QtCore/QCoreApplication>
- #include <QDebug>
- #include <QThread>
- #include "docktor.h"
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- qDebug() << QString("main thread id = : %1").arg(int(QThread::currentThreadId()));
- QThread docktorThread;
- Docktor docktor;
- docktor.moveToThread(&docktorThread);
- docktorThread.start();
- return a.exec();
- }
/////////////////截图/////////////
Qt应用Redis实现消息队列的更多相关文章
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- redis resque消息队列
Resque 目前正在学习使用resque .resque-scheduler来发布异步任务和定时任务,为了方便以后查阅,所以记录一下. resque和resque-scheduler其优点在于功能比 ...
- 【springboot】【redis】springboot+redis实现发布订阅功能,实现redis的消息队列的功能
springboot+redis实现发布订阅功能,实现redis的消息队列的功能 参考:https://www.cnblogs.com/cx987514451/p/9529611.html 思考一个问 ...
- 【Redis】php+redis实现消息队列
在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...
- Lumen开发:结合Redis实现消息队列(1)
1.简介 Lumen队列服务为各种不同的后台队列提供了统一的API.队列允许你推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度. 1.1 配置 .env文件的QUEUE_DRIVER选项 ...
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- sping+redis实现消息队列的乱码问题
使用spring支持redis实现消息队列,参考官方样例:https://spring.io/guides/gs/messaging-redis/ 实现后在运行过程中发现消费者在接收消息时会出现乱码的 ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...
随机推荐
- 10 TCP限流技术
TCP限流是因为让接收方充分接受完消息,保证数据安全,不会丢失 一.窗口机制介绍 发送端和接收端都拥有一个窗口,当发送端发送数据时,落进窗口的数据被发送,当接受端接受数据时,落进接收端窗口的数据将会被 ...
- RPC、RMI、REST的区别
初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...
- SEO要点
SEO要点:1.语义化html标签,用合适的标签嵌套合适的内容,不可过分依赖div,对浏览器更友善就能更容易被抓取.2.重要的内容html代码放在前面,放在左边.搜索引擎爬虫是从左往右,从上到下进行抓 ...
- go爬虫之爬取豆瓣电影
go爬取豆瓣电影 好久没使用go语言做个项目了,上午闲来无事花了点时间使用golang来爬取豆瓣top电影,这里我没有用colly框架而是自己设计简单流程.mark一下 思路 定义两个channel, ...
- Linux学习笔记(五)Linux常用命令:压缩命令
Linux中最常见的5中压缩格式: zip gz bz2 tar.gz tar.bz2 一..zip压缩命令 压缩文件 zip [压缩文件名] [源文件] 例如: zip zijeak.zip zij ...
- 移动端meta常用的设置
1.qq强制横屏或者竖屏显示 : <meta name="x5-orientation" content="portrait ||andscape&quo ...
- 关于Java的Object.clone()方法与对象的深浅拷贝
文章同步更新在个人博客:关于Java的Object.clone()方法与对象的深浅拷贝 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理.这时候就可以用到Java中的Object.clon ...
- cmake学习笔记之add_library、target_link_libraries和link_directories
cmake是Linux(这里默认是Ubuntu系统)下常使用的编译C++的工具,而使用cmake就需要先在CmakeLists.txt文件中对编译规则进行.这里介绍常用的三种指令add_library ...
- 用代理服务加快brew下载速度。方法:curl
加快brew更新速度的方式:用代理 参考: https://www.zhihu.com/question/31360766常用的ss客户端都自带PAC模式的,比如ShadowsocksX-NG. 再次 ...
- Centos6系统启动流程
Centos6系统启动流程 一.CentOS 5和6的启动流程 Linux内核:存在于/boot分区,是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制. ...