RedisUtils 接口文档¶
简介¶
简述:该文件提供了基于Redis的通信工具类,用于无人机仿真场景下的数据订阅回调处理,为RflySimSDK的通信模块提供Redis数据交互支撑。
在RflySim无人机仿真系统中,多个模块需要进行高效的跨进程数据交互,Redis作为高性能内存数据存储,常被用于无人机仿真中实时飞行数据、状态信息、传感器数据的中转分发。本模块封装了Redis通信的常用操作,并且提供了订阅回调的处理能力,适用于仿真环境下不同组件之间获取实时飞行数据、感知其他模块状态、响应数据更新的场景,可以帮助开发者快速搭建基于Redis的仿真数据通信链路,无需自行处理Redis连接、订阅回调的底层逻辑。
快速开始¶
以下示例使用 Redis 键值接口写入并读取无人机状态。运行前需要启动 RflySim 配套的 Redis 服务。
参考例程:[RflySim安装路径]\RflySimAPIs\9.RflySimComm\2.AdvExps\e1.CoaGraNetSimExps\3.Redis\e1.2-KeyValueComm
import RedisUtils
redisConnect = RedisUtils.RedisUtils()
uavState = {
"CopterID": 1,
"uavTimeStmp": 0.0,
"uavPosNED": [0.0, 0.0, -10.0],
"uavVelNED": [0.0, 0.0, 0.0],
}
# 以 UAV1 为键保存结构化数据
redisConnect.set_data("UAV1", uavState)
# 其他进程可使用相同键主动读取最新状态
data = redisConnect.get_data("UAV1")
if data is not False:
print(data)
环境与依赖¶
- Python 环境:
>= 3.8.10 - 依赖库:
json、redis、threading、time - 前置准备:调用此接口前,必须确保Redis服务正常运行并完成相关连接配置。
核心接口说明¶
该模块 RedisUtils.py 包含了配置变量、辅助函数及核心业务类。
全局常量与枚举定义¶
本节列出模块中所有可直接引用的全局常量和枚举定义。
独立常量¶
无
全局/独立函数¶
sub_callback(channel, data)¶
功能说明:消息订阅回调函数,用于处理对应通道接收到的消息数据,通常作为订阅接口的回调参数使用。 参数列表:
channel: 接收到消息的通道标识,指定该数据来源的通道data: 对应通道接收到的消息数据,为通道传输的实际内容
返回值:
- 无
异常: 无
RedisUtils 类¶
Redis工具类,用于提供Redis连接与数据操作相关的工具能力,隶属于RflySimSDK通信模块。
__init__()¶
功能说明:初始化Redis工具类实例。 参数列表 (Args): 无 返回值 (Returns):无 异常 (Raises):无
set_data(key, data)¶
功能说明:向Redis存储指定键的序列化数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis存储数据的键名 |
| data | 任意 | 是 | 无 | 需要存储的数据,会自动序列化 |
返回值 (Returns):无返回值 异常 (Raises):无
set_singledata(key, data)¶
功能说明:向Redis存储指定键的原始字符串数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis存储数据的键名 |
| data | str | 是 | 无 | 需要存储的原始字符串数据 |
返回值 (Returns):无返回值 异常 (Raises):无
get_data(key)¶
功能说明:从Redis获取指定键的反序列化数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis存储数据的键名 |
返回值 (Returns):反序列化后的原始数据,键不存在时返回None 异常 (Raises):无
get_singledata(key)¶
功能说明:从Redis获取指定键的原始字符串数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis存储数据的键名 |
返回值 (Returns):原始字符串数据,键不存在时返回None 异常 (Raises):无
get_data_list()¶
功能说明:获取当前Redis数据库中所有键名列表 参数列表 (Args):无参数 返回值 (Returns):包含所有键名的列表 异常 (Raises):无
del_data(key)¶
功能说明:删除Redis中指定键的数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | 需要删除的Redis数据键名 |
返回值 (Returns):无返回值 异常 (Raises):无
key_count()¶
功能说明:统计当前Redis数据库中的键总数 参数列表 (Args):无参数 返回值 (Returns):当前数据库中键的数量 异常 (Raises):无
clear_db()¶
功能说明:清空当前Redis数据库中的所有数据 参数列表 (Args):无参数 返回值 (Returns):无返回值 异常 (Raises):无
insert_data(db, data)¶
功能说明:向指定Redis列表队列尾部插入数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| db | str | 是 | 无 | Redis列表队列的键名 |
| data | 任意 | 是 | 无 | 需要插入队列的数据 |
返回值 (Returns):插入操作后队列的长度 异常 (Raises):无
get_one_data(db)¶
功能说明:从指定Redis列表队列头部取出一条数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| db | str | 是 | 无 | Redis列表队列的键名 |
返回值 (Returns):取出的数据,队列为空时返回None 异常 (Raises):无
get_all_data(db)¶
功能说明:获取指定Redis列表队列中的所有数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| db | str | 是 | 无 | Redis列表队列的键名 |
返回值 (Returns):包含队列所有数据的列表 异常 (Raises):无
queue_count(db)¶
功能说明:获取指定Redis列表队列的数据长度 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| db | str | 是 | 无 | Redis列表队列的键名 |
返回值 (Returns):队列中数据的数量 异常 (Raises):无
clear_queue(db)¶
功能说明:清空指定Redis列表队列的所有数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| db | str | 是 | 无 | Redis列表队列的键名 |
返回值 (Returns):无返回值 异常 (Raises):无
pub_data(key, data)¶
功能说明:向指定Redis频道发布序列化后的消息 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis发布订阅的频道名 |
| data | 任意 | 是 | 无 | 需要发布的消息数据,会自动序列化 |
返回值 (Returns):无返回值 异常 (Raises):无
pub_singledata(key, data)¶
功能说明:向指定Redis频道发布原始字符串消息 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| key | 任意 | 是 | 无 | Redis发布订阅的频道名 |
| data | str | 是 | 无 | 需要发布的原始字符串消息 |
返回值 (Returns):无返回值 异常 (Raises):无
sub_data(message_type, channel, callback)¶
功能说明:订阅指定Redis通道的多数据消息,消息到达时触发指定回调函数处理 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| message_type | - | 是 | 无 | 订阅消息的数据类型,用于解析接收到的消息 |
| channel | - | 是 | 无 | 要订阅的Redis通道名称 |
| callback | - | 是 | 无 | 消息到达时触发的回调函数,参数为解析后的消息 |
返回值 (Returns):无返回值 异常 (Raises):无
sub_singledata(message_type, channel, callback)¶
功能说明:订阅指定Redis通道的单数据消息,消息到达时触发指定回调函数处理 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| message_type | - | 是 | 无 | 订阅消息的数据类型,用于解析接收到的消息 |
| channel | - | 是 | 无 | 要订阅的Redis通道名称 |
| callback | - | 是 | 无 | 消息到达时触发的回调函数,参数为解析后的消息 |
返回值 (Returns):无返回值 异常 (Raises):无
sub_data_multiple_channels(message_type, channels, callback)¶
功能说明:同时订阅多个Redis通道的多数据消息,任意通道有消息到达时触发指定回调函数处理 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| message_type | - | 是 | 无 | 订阅消息的数据类型,用于解析接收到的消息 |
| channels | - | 是 | 无 | 要订阅的Redis通道名称列表,包含多个待订阅通道 |
| callback | - | 是 | 无 | 消息到达时触发的回调函数,参数为解析后的消息、来源通道信息 |
返回值 (Returns):无返回值 异常 (Raises):无
sub_singledata_multiple_channels(message_type, channels, callback)¶
功能说明:同时订阅多个Redis通道的单数据消息,任意通道有消息到达时触发指定回调函数处理 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| message_type | - | 是 | 无 | 订阅消息的数据类型,用于解析接收到的消息 |
| channels | - | 是 | 无 | 要订阅的Redis通道名称列表,包含多个待订阅通道 |
| callback | - | 是 | 无 | 消息到达时触发的回调函数,参数为解析后的消息、来源通道信息 |
返回值 (Returns):无返回值 异常 (Raises):无
进阶用法示例¶
以下示例组合使用发布订阅和键值读写:订阅线程接收多机状态,回调函数将汇总结果写回 Redis。
参考例程:[RflySim安装路径]\RflySimAPIs\9.RflySimComm\1.BasicExps\e4.RedisUAVsCommExps\2.NetSimMini_redis_nomat
import threading
import time
import RedisUtils
redisConnect = RedisUtils.RedisUtils()
uavData = {}
def sub_callback(channel, data):
uavData[channel] = data
print("收到", channel, data)
# 收齐三架无人机后,将位置汇总写入普通键值
if len(uavData) == 3:
positions = [uavData[key]["uavPosNED"] for key in sorted(uavData)]
redisConnect.set_data("UavPositions", positions)
channels = ["UAV2", "UAV3", "UAV4"]
subThread = threading.Thread(
target=redisConnect.sub_data_multiple_channels,
args=("message", channels, sub_callback),
)
subThread.start()
time.sleep(0.5)
# 发布本机状态;其他无人机使用各自的频道名称
redisConnect.pub_data(
"UAV1",
{"CopterID": 1, "uavPosNED": [0.0, 0.0, -10.0]},
)
注意事项与避坑指南¶
- 区分批量与单键操作方法:
set_singledata/get_singledata针对单个独立键值对操作,set_data/get_data针对列表类集合数据操作,混用会导致数据结构异常,无法正常读取结果。 - 清空数据库风险提示:调用
clear_db会直接清空当前所选Redis库的所有键值,包含RflySim仿真核心存储的飞行器状态、配置信息,仅在自定义数据任务完全结束后调用,仿真运行过程中禁止使用该方法。 - 空值返回处理:当查询的键不存在时,
get_singledata和get_one_data会返回None,直接对返回结果做属性或索引访问会引发空指针异常,使用前必须增加非空判断逻辑。 - 批量插入的键重复问题:
insert_data是向已有列表中追加数据,若需要覆盖原有列表内容,应先调用del_data删除旧键,再执行插入,否则会出现新旧数据混合的错误。
更新日志¶
2025-05-29: fix:更新平台协议汇总页面