Fat-Free Framework中Redis缓存数组添加值后跨请求失效问题
问题原因及解决方案
核心原因
问题出在F3的缓存操作未将修改后的数组同步回Redis,具体细节:
- 调用
$this->f3->get("API_CALLS")时,F3会把Redis中的缓存数据加载到当前请求的内存容器(Hive)中; $this->f3->push("API_CALLS", $api_log)仅修改了内存中的数组副本,并没有自动将更新后的数组重新写入Redis;- 当前请求结束后,内存中的Hive数据会被销毁,新请求从Redis读取的还是最初设置的空数组,因此看不到之前添加的日志。
简单说:你只修改了本地内存里的临时数据,没把更新结果存回Redis这个持久化缓存里。
修复代码
修改cache方法,确保修改数组后显式同步回Redis:
public function cache($url, $body, $response) { // 从Redis读取缓存,不存在则初始化空数组 $apiCalls = $this->f3->get('API_CALLS') ?: []; $createdAt = date("Y-m-d H:i:s"); $api_log = json_encode([ 'url' => $url, 'body' => $body, 'response' => $response, 'createdAt' => $createdAt ]); // 修改数组 array_push($apiCalls, $api_log); // 将更新后的数组重新写入Redis缓存 $this->f3->set('API_CALLS', $apiCalls, 86400); die(var_export($this->f3->get("API_CALLS"), true)); }
补充说明
F3的Hive(内存容器)和外部缓存(Redis)是两个独立存储层:
- Hive是请求级临时存储,仅在当前请求生命周期内有效;
- 外部缓存是跨请求持久化存储,修改后必须显式调用
set方法回写,才能让其他请求读取到更新后的数据。
内容的提问来源于stack exchange,提问作者Ali Habieb
相关产品推荐
相关产品推荐

