使用phpredis时能否不通过base64编码直接将二进制数据存入Redis Hashes?
Redis Hash结构是否支持直接存储二进制数据(无需base64编码)
结论
可以直接存储二进制数据,不需要提前做base64编码。
原理说明
Redis官方文档提及的「String类型二进制安全」,实际上覆盖了所有以String作为存储单元的复合结构:Hash结构的每个field对应的value、List的元素、Set的成员、ZSet的成员,底层存储本质都是String类型。官方没有单独说明其他类型的二进制安全特性,是因为这些类型的存储单元本身就是String,继承了String的全部特性,天然支持二进制内容存储。
phpredis 操作示例
phpredis扩展的Hash相关操作方法原生支持二进制字符串传入,普通调用即可完成存读:
// 初始化Redis连接 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 关闭自动序列化,避免扩展额外处理二进制内容 $redis->setOption(Redis::OPT_SERIALIZER, Redis::REDIS_SERIALIZER_NONE); // 构造二进制测试数据(示例为PNG文件头字节+null字节) $binaryData = pack('C*', 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00); // 直接写入Hash $redis->hSet('file_storage', 'png_header', $binaryData); // 读取验证 $fetchedData = $redis->hGet('file_storage', 'png_header'); var_dump($fetchedData === $binaryData); // 输出 bool(true)
注意事项
- 若开启了phpredis的自动序列化配置
OPT_SERIALIZER,请确保写入和读取时的序列化规则一致,不需要序列化的场景建议显式将该配置设为REDIS_SERIALIZER_NONE,避免二进制内容被额外转义 - 处理读取到的二进制内容时,使用
strlen统计长度,不要使用多字节字符串处理函数(如mb_strlen),避免内容长度计算错误
内容的提问来源于stack exchange,提问作者LI XiangChen
相关产品推荐
相关产品推荐

