You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis Pub/Sub传递原始二进制数据异常问题求助

解决Redis发布订阅二进制数据损坏的问题

问题不在Redis本身,而是你的shell命令和redis-cli默认行为导致的数据损坏,以下是修正方案:

1. 发布端:避免Shell修改二进制数据

你当前用while read line读取数据时,read命令会自动处理换行符、转义字符,还会截断包含换行的二进制数据,导致原始内容被修改。

替换为以下命令之一,确保原始二进制数据完整传递:

方案A:处理包含任意二进制的消息(推荐)

如果myProcess输出的每个消息以空字符(\0)分隔,用xargs配合-0参数:

myProcess | xargs -0 -I {} redis-cli --raw PUBLISH myChannel "{}"

方案B:保留所有字符的循环读取

如果需要按行读取但保留所有字符(包括换行、空格、转义符),用read的特殊参数:

myProcess | while IFS= read -r line || [[ -n "$line" ]]; do
  redis-cli --raw PUBLISH myChannel "$line"
done
  • IFS= 避免read去掉行首/行尾的空格
  • -r 禁止read解析反斜杠转义
  • || [[ -n "$line" ]] 确保最后一行没有换行符时也能被处理

2. 订阅端:以原始模式接收数据

默认的redis-cli SUBSCRIBE会输出格式化的文本结构(包含消息类型、频道名、内容的多行输出),还会转义不可打印的二进制字符,导致数据损坏。

改用--raw模式订阅,直接输出原始二进制内容:

redis-cli --raw SUBSCRIBE myChannel

注意:使用--raw后,redis-cli只会输出消息的原始内容,不会附带频道名等额外信息,适合只订阅单个频道的场景。

关键说明

  • --raw参数让redis-cli以原始二进制模式工作,发送/接收数据时不做任何转义或格式化
  • Shell的read、echo等命令默认会处理文本格式,传递二进制数据时必须禁用这些行为

内容的提问来源于stack exchange,提问作者Soroush Bgm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:30:17