Dragonfly是一款可直接替代Redis的解決方案,旨在以更少的伺服器數量實現更卓越的效能。單一節點便能處理每秒數百萬次的查詢,並支援高達1TB的記憶體資料。本文將探討如何將Dragonfly與Laravel結合使用,Laravel作為最廣泛使用且知名的網頁框架之一。
Dragonfly完全兼容Redis介面,意味著Laravel開發者無需修改任何程式碼,即可將其作為快取和佇列驅動程式整合。這種無縫接軌的整合,提供了一條輕鬆升級且極具優勢的路徑。
無論您是經驗豐富的Laravel老手,或是剛起步的新手,都歡迎一同深入探索Dragonfly與Laravel的世界。
開始使用
首先,讓我們建立一個新的Dragonfly實例。請訪問我們的文件這裡以下載映像或二進制檔案,並迅速讓Dragonfly實例運作起來。一旦Dragonfly實例啟動並可訪問,將其與您的Laravel專案整合將變得輕而易舉。幸運的是,Laravel已全面支援Redis,因此其所有驅動程式均可重用。要在Laravel應用程式中使用Dragonfly,首先更新.env
檔案,配置如下:
用於快取和會話管理:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
若要將Dragonfly也作為佇列驅動程式整合:
QUEUE_CONNECTION=redis
儘管我們使用redis
作為驅動值,但Dragonfly旨在直接替代Redis,因此無需安裝額外的驅動程序。設置好驅動後,下一步是確保Laravel能夠與Dragonfly實例通信。這涉及再次更新.env
文件,填入正確的連接詳情:
REDIS_HOST
:Dragonfly服務器的名稱或IP地址。REDIS_PORT
:Dragonfly實例運行的端口。REDIS_PASSWORD
:如已設置,Dragonfly實例的密碼。
以下是一個配置示例:
REDIS_HOST=127.0.0.1 # Replace with Dragonfly host
REDIS_PORT=6379 # Replace with Dragonfly port
REDIS_PASSWORD=null # Replace with Dragonfly password if applicable
更新這些設置後,通過在Laravel中運行一個簡單的操作,如INFO
,來驗證連接。如果遇到任何連接問題,請仔細檢查主機、端口和密碼值。同時,確保Dragonfly服務器正在運行,並且可從Laravel應用程序的環境中訪問。
use Illuminate\Support\Facades\Redis;
// 運行INFO命令並打印Dragonfly版本。
Redis::info()["dragonfly_version"];
作為緩存的高效率
緩存常用值是內存數據庫如Dragonfly和Redis的主要用途之一,因其快速響應時間。在涉及大量鍵和客戶端的場景中,Dragonfly尤為突出,典型應用於多節點系統或微服務的中央緩存。
A standout feature of Dragonfly is the cache mode, designed specifically for scenarios where maintaining a lean memory footprint is as crucial as performance. In this mode, Dragonfly evicts the least recently accessed values when it detects low memory availability, ensuring efficient memory usage without sacrificing speed. You can read more about the eviction algorithm in the Dragonfly Cache Design blog post.
激活緩存模式非常簡單。以下是運行Dragonfly在此模式下的標誌,設置內存上限為12GB:
./dragonfly --cache_mode --maxmemory=12G
考慮一種情況,您的應用程式需要處理大量請求並使用龐大的數據集。在這種情況下,Dragonfly 快取模式能有效地管理記憶體使用,同時提供快速數據存取,確保您的應用程式保持反應靈敏且靈活。
從API的角度來看,Laravel Cache facade 的所有功能都應該得到支援。例如,要儲存具有特定到期時間的給定金鑰和值,可以使用以下程式碼片段:
use Illuminate\Support\Facades\Cache;
// 儲存一個值,其到期時間為10分鐘。
Cache::put("key", "value", 600);
記憶體使用
使用Dragonfly作為快取的一個好處是,在大多數使用情況下,其記憶體使用量明顯較低。讓我們進行一個簡單的實驗,將隨機字串填充到Redis和Dragonfly中,並在填充數據後測量它們的總記憶體使用量。
Dataset | Dragonfly | Redis |
---|---|---|
3 Million Values of Length 1000 | 2.75GB | 3.17GB |
15 Million Values of Length 200 | 3.8GB | 4.6GB |
實驗後,我們觀察到在類似條件下,Dragonfly的記憶體使用量比Redis低高達20%。這允許您使用相同的記憶體需求儲存更多的有用數據,使快取更有效率並達到更高的覆蓋率。您可以在Redis vs. Dragonfly 可擴展性和性能博客文章中了解更多關於Dragonfly吞吐量基準和記憶體使用的信息。
快照功能
除了降低記憶體使用量外,Dragonfly 在快照處理過程中也展現了穩定性。快照尤其是在繁忙的實例中,對記憶體管理來說可能是一大挑戰。使用 Redis 時,在高度活躍的實例上捕捉快照可能導致記憶體使用量增加,因為 Redis 需要複製記憶體頁面,即使是那些僅部分被覆寫的頁面,這會導致記憶體使用量急劇上升。
相對地,Dragonfly 根據傳入請求調整快照順序,有效防止任何意外的記憶體使用量激增。這意味著即使在如快照這樣的密集操作期間,Dragonfly 仍能維持穩定的記憶體足跡,確保性能一致,無突然記憶體峰值的風險。您可以在 《平衡 vs. 不平衡》部落格文章中了解更多關於 Dragonfly 快照算法的資訊。
關鍵黏性
Dragonfly 還引入了新功能,即自訂的 STICK
命令。此命令在以快取模式運行的實例中特別有用。它允許將特定金鑰標記為不可驅逐,無論其存取頻率如何。
此功能特別適用於儲存不常存取但重要的數據。例如,您可以可靠地保存輔助資訊,如動態配置值,直接存於您的Dragonfly實例中。這消除了為不常用但關鍵的數據設置獨立數據儲存的需求,簡化了數據管理流程。
// 在Dragonfly實例中存儲具有黏性的值。
Redis::transaction(function (Redis $redis) {
$redis->set('server-dynamic-configuration-key', '...');
$redis->command('STICK', 'server-dynamic-configuration-key');
});
// ...
// 由於金鑰無法被驅逐,因此將始終返回值。
$redis->get('server-dynamic-configuration-key');
提升隊列管理中的吞吐量
Dragonfly與Redis相似,擅長管理隊列和任務。如您所料,將此用途轉換為使用Dragonfly是無縫的,無需修改代碼。考慮以下Laravel中的示例,其中分派了一個播客處理任務:
use App\Jobs\ProcessPodcast;
$podcast = Podcast::create(/* ... */);
ProcessPodcast::dispatchSync($podcast);
無論是Dragonfly還是Redis,都能輕鬆處理每秒數萬個任務。
對於追求最大化性能的人來說,重要的是要注意使用單一工作隊列不會帶來顯著的性能提升。要真正利用Dragonfly的能力,應使用多個隊列。這種方法將負載分散到多個Dragonfly線程上,從而增強整體吞吐量。
然而,一個常見的挑戰是當同一隊列中的鍵最終落在不同線程上時,會導致延遲增加。為了解決這個問題,Dragonfly 提供了在隊列名稱中使用標籤的功能。這些標籤確保同一隊列(使用相同標籤)中的作業會自動分配給特定線程,類似於 Redis Cluster 環境中的做法,從而減少延遲並優化性能。要了解更多關於標籤的信息,請查閱運行 BullMQ 與 Dragonfly 的博客文章,其中詳細解釋了標籤及其好處,同時 Dragonfly 被用作消息隊列系統的後端存儲。
作為一個快速示例,為了使用 Dragonfly 優化您的隊列管理,首先啟動 Dragonfly 並使用特定的旗標來啟用基於標籤的鎖定和模擬集群模式:
./dragonfly --lock_on_hashtags --cluster_mode=emulated
一旦 Dragonfly 使用這些設置運行,就將標籤融入 Laravel 中的隊列名稱。以下是一個示例:
ProcessPodcast::dispatch($podcast)->onQueue('{podcast_queue}');
通過在隊列名稱中使用標籤,您確保屬於同一隊列的所有消息在 Dragonfly 中由同一線程處理。這種方法不僅使相關消息保持在一起,增強效率,還允許 Dragonfly 通過在多個線程上分配不同隊列來最大化吞吐量。
此方法對於依賴Dragonfly作為消息隊列後端存儲的系統尤其有效,因為它利用了Dragonfly的多線程架構,能更高效地處理大量消息。
結論
Dragonfly能夠以較低的內存使用量處理大規模工作負載及其多線程架構,使其成為現代網絡應用的一個引人注目的選擇。本文中,我們探討了Dragonfly如何無縫整合到Laravel中,無論是緩存、會話管理還是隊列管理,所需代碼變動極少甚至無需變動。
Source:
https://dzone.com/articles/using-laravel-with-dragonfly