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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:15:06