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
相关产品推荐
相关产品推荐

