【发布时间】:2018-02-18 01:33:36
【问题描述】:
我有一个用 Laravel 编写的 API。里面有如下代码:
public function getData($cacheKey)
{
if(Cache::has($cacheKey)) {
return Cache::get($cacheKey);
}
// if cache is empty for the key, get data from external service
$dataFromService = $this->makeRequest($cacheKey);
$dataMapped = array_map([$this->transformer, 'transformData'], $dataFromService);
Cache::put($cacheKey, $dataMapped);
return $dataMapped;
}
在 getData() 中,如果缓存包含必要的键,则从缓存返回数据。 如果缓存没有必要的密钥,则从外部 API 获取数据,处理并放入缓存,然后返回。
问题是:当方法有很多并发请求时,数据被破坏了。我想,由于竞争条件,数据被错误地写入缓存。
【问题讨论】:
-
旁注,您可以使用
$value = Cache::remember(key, duration, callback)从缓存中获取值(如果存在)或获取回调结果(如果不存在)。这也可以确保原子性(尽管不确定)。但是redis并没有真正从并发设置请求中中断,这很好,问题一定是并发远程请求 -
好的,我试试
-
使用什么缓存驱动?
-
redis 缓存驱动
-
@apokryfos,不幸的是 $value = Cache::remember(key, duration, callback) 不起作用。