2016-01-20 136 views
1

可以說我有一個系統,我有3個模型製造商,車輛和品牌。Laravel緩存用戶相關緩存

Vehicles -> One to one -> brand/manufacturer 
Manufacturer -> One to many -> brand/vehicles 
Brand -> One to many -> Vehicles 
Brand -> One to One -> Manufacturer 

該系統有一個管理面板和一個用戶面板。

管理面板:

在管理控制檯中,我通常不喜歡這樣

Vehicle::with('manufacturer', 'brand')->get(); 

我也不要緩存此查詢,我認爲它的罰款,我不需要在多速率管理員區域。

用戶區:

但在用戶方面,我使用更簡單的查詢,因爲我已經閱讀了簡單的查詢是更好,因爲它們可以被緩存。因此,我使用一個查詢來獲取車輛的製造商,並使用另一個查詢來獲得車輛的品牌。然後我準備一個數組發送到視圖。這裏是一個示例查詢

Manufacturer::where('vehicle_id', $vehicleID)->where('is_active', 1)->get($columns); 

每個用戶將有不同的車輛。可以說用戶A有10輛車和用戶B有20輛車。

所以我的問題是我如何緩存用戶特定的查詢,不斷變化?

其次有沒有任何可靠的但自動化的方式來做到這一點,而不是改變代碼,像memcache或類似的東西?

我也聽說過Redis緩存,我認爲它抓取所有的數據從MySQL,然後存儲在Redis和下次它只是從Redis而不是MySQL獲取它。這是否更好?我可以做到這一點,而不需要改變很多代碼?

注意:還有一點需要記住的是,該系統必須是可自動擴展的,即用於aws beanstalk或類似的應用程序,因此數據庫應該同步。不知道同步如何工作。

一如既往,任何幫助表示讚賞。

+0

您是否試圖緩存結果。 Cache :: put('user')。$ userID,$ result,env('CACHE_TIME')); –

+0

不,我沒有,因爲我不知道我應該使用哪個緩存系統。其次,數據在不斷變化。假設有人在接下來的30秒內購買一輛車,你如何處理這樣的事情? –

+0

我會爲你做一個答案。 –

回答

2

代碼示例。

$result = {your result} 

if (!Cache::has('user' . $userID) || env('CACHE_TIME') < 0) { 
    Cache::put('user' . $userID, $result, env('CACHE_TIME')); 
} else { 
    $result = Cache::get('user' . $userID); 
} 

.ENV文件

CACHE_TIME = 240 // cache time minutes, you can disable cache with -1 
CACHE_DRIVER=file 

用戶購買後車輛

Cache::forget('user' . $userID); 

注:您可以更改高速緩存方法。更多信息https://laravel.com/docs/5.1/cache

+0

我真的很喜歡這個想法,它的簡單但非常強大。我唯一擔心的是,如果我使用基於文件的緩存驅動程序,它將如何對自動縮放做出反應(可能有3個克隆服務器運行相同的腳本)? –

+0

我無法嘗試redis與laravel,但我認爲你可以使用通過縮放問題。 –

+1

將調查。謝謝,Gorkem –