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

如何使用PHP将对象数组存入Redis缓存并保留键值对结构

PHP操作Redis保留关联数组键值结构的解决方法

问题原因

使用rpush往Redis列表中直接传入PHP关联数组时,PHP Redis扩展会默认将关联数组拍平为仅保留值的索引数组,把每个值作为独立的列表元素存入,因此原有键名会丢失。

解决方法

方法1:序列化后存入列表(兼容现有List存储逻辑)

如果你的业务需要用List结构存储多个关联数组元素,只需在存入前将数组转为序列化字符串,取出时反序列化即可。推荐用JSON序列化,通用性更强:

$obj = array(
    'request_id' => $request_id,
    'request_start_dttm' => $start_time,
    'client_id' => $clientId,
);

$redis = Redis::connection();
$name = "API".bin2hex(random_bytes(3));
// 存入前JSON序列化,JSON_UNESCAPED_UNICODE参数避免中文乱码
$redis->rpush($name, json_encode($obj, JSON_UNESCAPED_UNICODE));

// 取出后逐个反序列化为关联数组
$raw_list = $redis->lrange($name, 0, -1);
$formatted_list = array_map(function($item) {
    return json_decode($item, true);
}, $raw_list);

print_r($formatted_list);

如果仅在PHP生态内使用,也可以用PHP原生序列化函数serialize()和unserialize(),可以完整保留PHP特有数据类型。

方法2:改用Redis Hash结构(无需列表存储时的最优方案)

如果你只是要单独存储一组键值对,不需要List的队列特性,直接用Redis原生的Hash结构更贴合需求,无需额外序列化:

$obj = array(
    'request_id' => $request_id,
    'request_start_dttm' => $start_time,
    'client_id' => $clientId,
);

$redis = Redis::connection();
$name = "API".bin2hex(random_bytes(3));
// 批量写入Hash键值
$redis->hset($name, $obj);
// 直接读取完整Hash结构,自动保留原有键值对
print_r($redis->hgetall($name));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:18:01