qt之使用redis与其他程序(python)交互同通信

一、前言

有需求,趁热调试出了嵌入式系统的算法环境安装和远程桌面以及一些其他的之前一直未调试出搁置的功能,趁热继续调试进阶功能redis通信,redis与sqlite各有千秋,redis可以作为在嵌入式系统下多个程序之间相互通信的中间件,很方便,谁也不用嵌入子程序,大家一起通过redis共享数据,这个感觉在数据通信方向又有个质的提升了

PS:虽然只是会使用,但是能使用起来,说明成长了!

目录

1.为什么不使用UDP或者TCP,而选择redis通信

2.安装redis环境(windows)

3.嵌入式设备中redis适配

下载资源

二、环境

windows10

qt5.7

python3.8

redis5.0.14.1

三、正文

1.为什么不使用UDP或者TCP,而选择redis通信

直接使用 TCP 或 UDP 进行通信

优点

简单直接:实现相对简单,不需要额外安装和配置 Redis 服务。使用标准的网络编程接口,如 Python 的socket库和 Qt 的QTcpSocket、QUdpSocket类,就可以快速搭建起通信机制。

轻量级:没有额外的中间件依赖,减少了系统的复杂度和资源消耗。对于简单的通信需求,TCP 或 UDP 可以提供足够的性能。

灵活性高:可以根据具体需求自定义通信协议,能够更好地适应不同的应用场景。

缺点

缺乏数据共享:TCP 和 UDP 主要用于传输数据,不提供数据共享和存储功能。如果需要在多个程序之间共享数据,需要自己实现数据存储和同步机制。

缺乏消息队列:对于异步消息处理和任务调度,TCP 和 UDP 没有内置的消息队列功能,需要自己实现队列机制。

可靠性和扩展性有限:在处理大量并发连接和高并发请求时,TCP 和 UDP 的可靠性和扩展性可能会受到限制。

使用 Redis 进行通信

优点

数据共享:Redis 是一个内存数据库,支持多种数据结构(如字符串、哈希、列表、集合等),可以方便地在多个程序之间共享数据。例如,Qt 程序和 Python 程序可以同时访问和修改 Redis 中的数据,实现数据的实时同步。

消息队列:Redis 提供了消息队列功能,如LIST数据结构可以用作简单的消息队列。可以使用LPUSH和RPOP等命令实现消息的发布和订阅,方便实现异步消息处理和任务调度。

高并发处理:Redis 是单线程的,通过 I/O 多路复用技术实现高并发处理。它可以处理大量的并发连接和高并发请求,适合用于分布式系统和高并发场景。

持久化:Redis 支持数据持久化,可以将内存中的数据保存到磁盘上,防止数据丢失。在程序重启后,可以从磁盘中恢复数据,保证数据的安全性和可靠性。

分布式锁:Redis 提供了分布式锁功能,可以用于解决多个程序之间的并发访问问题。例如,在多个程序同时访问共享资源时,可以使用 Redis 的分布式锁来保证资源的独占性。

缺点

复杂性增加:需要额外安装和配置 Redis 服务,增加了系统的复杂度和维护成本。

性能开销:由于 Redis 是一个独立的服务,数据的读写需要通过网络进行,会引入一定的性能开销。

总结

如果你的通信需求比较简单,只需要进行简单的数据传输和交互,直接使用 TCP 或 UDP 进行通信是一个不错的选择。如果你的应用场景需要数据共享、消息队列、高并发处理等功能,使用 Redis 进行通信可以带来更多的便利和优势。

2.安装redis环境(windows)

首先确保python环境和QT环境都是可以正常运行的

独立测试启动程序都没有问题

之后安装redis服务软件

2.1Windows电脑环境安装(windows、qt和python都要安装redis环境)

1.Windows安装redis

下载Redis-x64-5.0.14.1.msi文件进行安装。此种方式不仅会将Redis安装目录添加到系统环境变量,还会安装一个Redis系统服务。双击msi安装

参考链接https://blog.csdn.net/collman/article/details/141638356

参考链接Windows下Redis的安装和使用 - 哔哩哔哩

修改redis.windows.conf文件,504行添加requirepass 123456

使用powershell终端,进入redis安装目录, cd D:/LenovoSoftstore/Install/redis

启动服务,网上有的直接发送redis-server,我这需要发送./redis-server

验证成功

执行启动redis

cd D:/LenovoSoftstore/Install/redis

redis-server --service-start

查看redis运行状态

tasklist /FI "IMAGENAME eq redis-server.exe"

测试服务运行状态发送 redis-cli,之后输入set m_int 10返回OK在输入get m_int返回10

获取已经开启的字段列表,命令keys * 查看列表key键值get xxx

详细的redis用法继续上网查吧,分什么订阅和发布,好多模式,这里只是简单测试

2.Qt安装redis

qt调用redis有很多种方式,有的要把redis打包动态库调用,有的要引用一堆文件,资料很少,最终在网上下载找出一种类似调用开源第三方控件的方式,把redis的源码嵌入到程序中,不受编译环境限制,这样qt程序无论时在window下测试还是在虚拟机中交叉编译都可以通过,最终也可以在目标机中运行,程序见test_redis_py_qt.rar重新用AI整合联调python测试

验证,开启redis服务后redis-server --service-start运行qt程序

连接成功

关闭redis服务后redis-server --service-stop运行qt程序

提示错误信息,qt与windows的redis连接交互成功

3.python安装redis

使用命令安装pip install redis

使用pip list查看列表

测试python是否能够调用redis,使用powershell的cd命令进入到测试程序目录

开启redis服务后redis-server --service-start

执行python pytest_enviroment.py(是一个环境测试程序,不是整体的测试程序)

关闭redis服务后redis-server --service-stop

执行python pytest_enviroment.py

报一堆错误信息,反正就是失败

4.整体测试

上面测试都是简单的测试是否能连接,整体测试是将三者结合起来一起测试通信,首先redis服务开启,之后运行qt程序和python程序,qt程序就是可执行文件,双击运行即可,python程序开启5个控制台,都进入到程序目录,执行python xxx.py命令启动程序,之后进行测试

开启服务redis-server --service-start

进入python程序目录cd xxx

启动qt程序

启动python程序

Numpy不能版本太高,要在1.24以下,下面命令降级numpy,否则有俩py程序运行异常

pip install numpy==1.23.5 -i https://mirrors.aliyun.com/pypi/simple/

继续启动程序

python pytest_redis_numpy.py

python pytest_redis_pandas.py

python pytest_redis_tensorflow.py

python pytest_redis_scikitlearn.py

python pytest_redis_matplotlib.py

全部启动成功在终端中循环运行,并打印信息

之后用qt程序依次点击上方的测试按键,会将消息发送给redis,之后python程序监听redis的message消息,处理并返回相应的数据给redis,qt程序订阅redis的消息就会在线程中查询到,之后在textedit显示出来,qt程序订阅了必须用线程处理,否则程序会卡死。

测试成功图,qt程序按下按键py程序收到后有不同的打印信息,最后qt程序窗口显示内容

服务一停,全挂!!!redis-server --service-stop

目前qt程序和python程序在redis服务异常关闭时都会停止运行,这点暂时不处理,先保证环境都是正常启动运行

2.2.嵌入式设备中redis适配****(linux系统、qt和python都要安装redis环境)****

Ubuntu开发环境(qt安装redis环境)

得益于我选用的方法是将redis源码内嵌到qt工程中,不需要单独打包编译动态库和依赖系统环境,所以直接将qt源码放在虚拟机的交叉编译环境,咔嚓一编译,咔擦直接生成程序

也能运行起来,就是环境没配置完,缺少环境,下面继续

1.麒麟系统安装redis

sudo apt install redis-server

之后创建自启服务文件

sudo vim /etc/systemd/system/redis.service

内容如下,如果已经有内容了就不用创建了,退出即可

bash 复制代码
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target

之后执行命令设置启动

sudo systemctl daemon-reload

sudo systemctl enable redis

sudo systemctl start redis

验证启动状态

sudo systemctl status redis

应显示 "active (running)"

重启后在查询仍然已经启动

2.Qt安装redis

程序实现,无需安装,同上述windows方法

3.python安装redis

使用命令安装pip install redis

使用pip list查看列表

一看已经有了,母鸡到什么时候安装的

测试python pytest_enviroment.py

很ok

4.整体测试

将程序放在麒麟系统中,权限一给 chmod 777 *

先手动运行(不能命令运行)(又可以命令运行了,趁热打铁把这个问题也解决了,嘿嘿)

export DISPLAY=:0

./test_redis_py_qt

程序成功运行起来并连接redis成功(此处有掌声,截图是从远程桌面截的)

挨个按键点击一次,都没有问题

接下来就是开启python程序

python pytest_redis_numpy.py

python pytest_redis_pandas.py

python pytest_redis_tensorflow.py

python pytest_redis_scikitlearn.py

python pytest_redis_matplotlib.py

好的!所有程序都可以正常运行,这个环境安装的不错,鼓掌

全部程序都在运行,qt程序挨个点两遍测试

还是远程桌面截图,嘿嘿

关闭服务(这里与window命令不同)sudo systemctl stop redis

同样qt程序和python程序在redis服务异常关闭时都会停止运行,这点暂时不处理,先保证环境都是正常启动运行

四、结语

下载资源说明:

资源内部由window下的redis安装包,有qt使用redis的源码包,不使用网上大部分的打包动态库的方式,而是使用调用redis源码文件的形式,好处就是qt内嵌redis的工程可以任意移植到其他平台交叉编译,因为我就是这个需求,在window下只是测试,实际我的需求环境是银河麒麟系统下redis服务,负责多个程序之间的数据通信交互,有qt的程序和python的程序,如果直接用qt调用python程序,缺点很多,很卡,很慢,懂得都懂,要不也不会研究redis了

下载资源点此,有惊吓🤭

相关推荐
KevinRay_6 分钟前
从零开始学习SQL
数据库·学习·mysql
Json_1817901448033 分钟前
python采集淘宝拍立淘按图搜索API接口,json数据示例参考
服务器·前端·数据库
ktkiko1144 分钟前
用户模块——整合 Spring 缓存(Cacheable)
java·spring·缓存
Albert Tan1 小时前
Oracle 10G DG 修复从库-磁盘空间爆满导致从库无法工作
数据库·oracle
好记忆不如烂笔头abc1 小时前
oracle-blob导出,在ob导入失败
大数据·数据库·python
私风翼1 小时前
SQL注入:基于GET和POST的报错注入详解
数据库·sql
Y第五个季节1 小时前
Redis - 概述
redis
好龙75752 小时前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
西木Qi2 小时前
Redis数据迁移同步
数据库·redis·缓存
暗恋 懒羊羊2 小时前
【MySQL】数据类型
数据库·mysql