Laravel Lumen中Redis keys查询支付方式交易数据为空问题求助
问题解决:Redis按支付方式统计交易数据返回空值
问题根源
你当前的代码逻辑存在结构错误:
- 用
Redis::hmset把交易数据存在了transaction:{id}格式的哈希键中,payment_method是哈希的一个字段,并非Redis键名的一部分。 - 后续用
Redis::keys("transaction:*:payment_method:{$method}")查询时,Redis会寻找完全匹配该字符串格式的键,但这类键根本不存在,所以返回空数组。
修正方案
需要在存储交易数据的同时,为每个支付方式维护一个集合(Set),用来记录对应支付方式下的所有交易ID,这样可以快速关联到对应的交易哈希数据。
1. 修改数据存储逻辑
// Define sample payment transactions $transactions = [ ['transaction_id' => 1, 'amount' => 100, 'status' => 'success', 'payment_method' => 'credit_card', 'timestamp' => time()], ['transaction_id' => 2, 'amount' => 150, 'status' => 'success', 'payment_method' => 'paypal', 'timestamp' => time()], ['transaction_id' => 3, 'amount' => 200, 'status' => 'failed', 'payment_method' => 'credit_card', 'timestamp' => time()], ['transaction_id' => 4, 'amount' => 200, 'status' => 'failed', 'payment_method' => 'credit_card', 'timestamp' => time()], ['transaction_id' => 5, 'amount' => 200, 'status' => 'failed', 'payment_method' => 'credit_card', 'timestamp' => time()], ]; // Store sample transactions in Redis foreach ($transactions as $transaction) { try { $transactionKey = "transaction:{$transaction['transaction_id']}"; // 存储交易哈希数据 Redis::hmset($transactionKey, $transaction); // 将交易ID添加到对应支付方式的集合中 Redis::sadd("payment_method:{$transaction['payment_method']}", $transaction['transaction_id']); } catch (\Exception $e) { \Illuminate\Support\Facades\Log::error("Error storing transaction in Redis: " . $e->getMessage()); } }
2. 修改报表生成逻辑
// Generate report by payment method $paymentMethods = ['credit_card', 'paypal', 'bank_transfer']; $report = []; foreach ($paymentMethods as $method) { // 获取该支付方式下的所有交易ID $transactionIds = Redis::smembers("payment_method:{$method}"); $totalAmount = 0; $totalCount = count($transactionIds); foreach ($transactionIds as $id) { $data = Redis::hgetall("transaction:{$id}"); // 强制转换为整数避免类型错误 $totalAmount += (int)$data['amount']; } $report[] = [ 'payment_method' => $method, 'total_amount' => $totalAmount, 'total_count' => $totalCount, ]; } return response()->json($report);
额外优化提示
- 生产环境中禁止使用
keys命令:它会遍历Redis所有键,导致服务阻塞,数据量大时影响尤为严重。用集合的方式既高效又安全。 - 如果需要更高效的统计,可以在存储时直接维护每个支付方式的总金额和总数量(用Redis字符串或哈希存储),避免后续遍历交易计算,示例:
生成报表时直接读取这些统计值即可,无需遍历交易。// 存储时更新统计数据 Redis::hincrby("payment_method_stats:{$method}", 'total_amount', $transaction['amount']); Redis::hincrby("payment_method_stats:{$method}", 'total_count', 1);
内容的提问来源于stack exchange,提问作者willy andika
相关产品推荐
相关产品推荐

