摘要:有緩存的話(huà)就走緩存,然后那邊的模塊內(nèi)部實(shí)現(xiàn)一個(gè)包括過(guò)期時(shí)間呀啥啥的緩存機(jī)制,沒(méi)有收到緩存模塊的響應(yīng)的時(shí)候就繼續(xù)走原來(lái)的應(yīng)用邏輯,一樣可以正常響應(yīng)。因?yàn)槲覀兪且獙?shí)現(xiàn)應(yīng)用邏輯與緩存邏輯的解耦,所以正常應(yīng)用邏輯內(nèi)是不能有對(duì)那些緩存的依賴(lài)的。
原文地址:https://prinzeugen.net/use-ob...
唔,我也不知道我接下來(lái)要講的東西是不是配得上這個(gè)題目,總之就是分享一下我在搞 Blessing Skin Server 的緩存與插件機(jī)制時(shí)的一些經(jīng)驗(yàn)(大佬們就請(qǐng)忽略吧)
既然要實(shí)現(xiàn)松散耦合的緩存機(jī)制,那就是要做到有沒(méi)有緩存都沒(méi)事。有緩存的話(huà)就走緩存,然后那邊的模塊內(nèi)部實(shí)現(xiàn)一個(gè)包括過(guò)期時(shí)間呀啥啥的緩存機(jī)制,沒(méi)有收到緩存模塊的響應(yīng)的時(shí)候就繼續(xù)走原來(lái)的應(yīng)用邏輯,一樣可以正常響應(yīng)。
因?yàn)槲覀兪且獙?shí)現(xiàn)應(yīng)用邏輯與緩存邏輯的解耦,所以正常應(yīng)用邏輯內(nèi)是不能有對(duì)那些緩存的依賴(lài)的。那么我們要通過(guò)什么來(lái)和緩存模塊通信呢?巧的是,Laravel 正好提供了基于 Event 和 Listener 的觀察者模式,我們就可以用這種設(shè)計(jì)模式來(lái)解耦緩存模塊。
首先,我們?cè)诩磳@取一個(gè)可能需要緩存的數(shù)據(jù)之前,觸發(fā)一個(gè) GetDataEvent(舉個(gè)栗子),接下來(lái)判斷這個(gè) Event 是否返回了響應(yīng),如有則使用響應(yīng)的內(nèi)容,沒(méi)有的話(huà)就繼續(xù)正常的應(yīng)用邏輯來(lái)獲取數(shù)據(jù)。
譬如說(shuō),我們需要把皮膚的預(yù)覽圖給緩存下來(lái),而不是每次都去生成:
texture = $texture; $this->size = $size; } }
// 控制器中的方法 public function preview($tid, $size = 250) { // 觸發(fā)事件 $responses = Event::fire(new GetSkinPreview($t, $size)); // 當(dāng)然,如果你有多個(gè) Listener 的話(huà),在這里你可能需要遍歷 Event 所返回的響應(yīng) if (isset($responses[0]) && $responses[0] instanceof SymfonyComponentHttpFoundationResponse) { // 這個(gè)返回的響應(yīng)類(lèi)型是看你自己對(duì) Event 的需求的 // 比如這里我們需要 Listener 返回一個(gè) Http 響應(yīng)流 return $responses[0]; } else { /* 原來(lái)業(yè)務(wù)邏輯中的生成預(yù)覽 */ return Response::png(); } }
而這個(gè) GetDataEvent,我們是可以注冊(cè) Listener 上去的,具體如何添加 Event 和 Listener 請(qǐng)參考 Laravel 文檔。假設(shè)我們?cè)谶@里給這個(gè)事件注冊(cè)了一個(gè) CacheDataListener,那么在 GetDataEvent 這個(gè)事件在應(yīng)用邏輯中被觸發(fā)的時(shí)候,Laravel 的 Event Dispatcher 就會(huì)把事件分發(fā)到我們剛剛注冊(cè)的監(jiān)聽(tīng)器里,我們就可以在監(jiān)聽(tīng)器的 handle 方法中處理緩存邏輯并返回緩存后的數(shù)據(jù)了。
texture->tid; if (!Storage::disk("cache")->has("preview/$tid")) { /* 這里生成預(yù)覽并保存到緩存文件 */ } return Response::png(Storage::disk("cache")->get("preview/$tid")); } }
這樣下來(lái),我們就可以讓?xiě)?yīng)用邏輯和緩存邏輯(差不多)完全分離開(kāi)來(lái),想要使用其他的緩存驅(qū)動(dòng),例如 Redis 的話(huà),只要新建一個(gè) Listener 并監(jiān)聽(tīng) GetDataEvent 就可以了。你甚至可以把緩存機(jī)制放到插件里去,而這也就是我本來(lái)的目的(笑)
以上只是我的個(gè)人見(jiàn)解,如果有什么不對(duì)的地方,還請(qǐng)大佬們多指教啊 (つд?)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30443.html
摘要:創(chuàng)建型設(shè)計(jì)模式通過(guò)控制這個(gè)對(duì)象的創(chuàng)建方式來(lái)解決此問(wèn)題。通過(guò)這樣做,這些模式增加了執(zhí)行此通信的靈活性。已于年月日翻譯完畢,參與用戶(hù)人,詳細(xì)列表請(qǐng)見(jiàn)參與譯者。 showImg(https://segmentfault.com/img/bV6R8Q?w=1024&h=683); 翻譯進(jìn)度請(qǐng)見(jiàn):https://laravel-china.org/doc... 設(shè)計(jì)模式不僅代表著更快開(kāi)發(fā)健壯軟件...
摘要:模式定義觀察者模式定義對(duì)象間的一種一對(duì)多依賴(lài)關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴(lài)對(duì)象皆得到通知并被自動(dòng)更新。 觀察者模式 Laravel的Event事件系統(tǒng)提供了一個(gè)簡(jiǎn)單的觀察者模式實(shí)現(xiàn),能夠訂閱和監(jiān)聽(tīng)?wèi)?yīng)用中發(fā)生的各種事件,在PHP的標(biāo)準(zhǔn)庫(kù)(SPL)里甚至提供了三個(gè)接口SplSubject, SplObserver, SplObjectStorage來(lái)讓開(kāi)發(fā)者更容易地實(shí)現(xiàn)觀...
摘要:事件驅(qū)動(dòng)編程是圖形用戶(hù)界面和其他應(yīng)用程序例如應(yīng)用程序中使用的主要范例,用于執(zhí)行某些操作來(lái)響應(yīng)用戶(hù)輸入。我們來(lái)看一下事件驅(qū)動(dòng)編程帶來(lái)的收益。現(xiàn)在讓我們看看采用事件驅(qū)動(dòng)編程方法如何實(shí)現(xiàn)上述相同的功能。 在這篇文章中我們將了解到什么是事件驅(qū)動(dòng)編程以及在Laravel中如何開(kāi)始構(gòu)建一個(gè)事件驅(qū)動(dòng)應(yīng)用,同時(shí)我們還將看到如何通過(guò)事件驅(qū)動(dòng)編程來(lái)對(duì)應(yīng)用程序的邏輯進(jìn)行解耦。 在開(kāi)始之前,先說(shuō)明一下這篇文章...
摘要:如何實(shí)現(xiàn)持久化持久化,將在內(nèi)存中的的狀態(tài)保存到硬盤(pán)中,相當(dāng)于備份數(shù)據(jù)庫(kù)狀態(tài)。相當(dāng)于備份數(shù)據(jù)庫(kù)接收到的命令,所有被寫(xiě)入的命令都是以的協(xié)議格式來(lái)保存的。 最近社區(qū)里面有一篇文章引起了最多程序猿的關(guān)注,Laravel、PHPer 面試可能會(huì)遇到的問(wèn)題,看評(píng)論區(qū)不少小伙伴們被難倒,對(duì)于一些問(wèn)題同樣難倒了我(其實(shí)有很多啦),趁著周末有空,又總結(jié)梳理了一遍,順便來(lái)答一波題。由于個(gè)人技術(shù)水平有限,答...
閱讀 3686·2021-09-07 10:19
閱讀 3627·2021-09-03 10:42
閱讀 3584·2021-09-03 10:28
閱讀 2548·2019-08-29 14:11
閱讀 809·2019-08-29 13:54
閱讀 1594·2019-08-29 12:14
閱讀 417·2019-08-26 12:12
閱讀 3614·2019-08-26 10:45