如何使用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
相关产品推荐
相关产品推荐

