首頁 後端開發 php教程 使用REDIS緩存加速現有應用程序

使用REDIS緩存加速現有應用程序

Feb 17, 2025 am 11:03 AM

Redis 加速現有應用:緩存查詢,減輕服務器負載

核心要點:

  • Redis 通過緩存查詢結果來有效加速現有應用程序,從而減輕服務器壓力。它會將查詢結果存儲指定時間(例如 24 小時),然後重複使用這些結果,顯著提高應用程序速度。
  • Redis 的安裝可以通過操作系統包管理器或手動安裝完成。安裝過程包括避免常見警告並確保 Redis 在服務器重啟後自動啟動。
  • Predis 庫與 Redis 配合使用,為應用程序提供內存緩存層。此過程包括檢查緩存中是否存在當前查詢的結果,如果不存在則獲取結果,並將其存儲以供將來使用。
  • 為了進一步提高性能,Predis 建議安裝 phpiredis,這是一個 PHP 擴展,可以降低 Redis 協議序列化和解析的開銷,使 Redis 安裝速度更快。

我們之前已經介紹過 PHP 中 Redis 的基礎知識,但現在是時候介紹一個實際應用案例了。在本教程中,我們將它添加到已部署的應用程序中,以提高應用程序速度。

Speeding up Existing Apps with a Redis Cache

您可以克隆應用程序的 0.6 版本來輕鬆學習。

問題描述:

在應用解決方案之前,我們需要明確問題定義。

所討論的應用程序在執行查詢時,會訪問 Diffbot 的 API 並查詢數據集。然後返回並顯示子集。這可能需要 5 秒左右的時間,具體取決於 Diffbot 服務器的繁忙程度。雖然隨著他們擴展計算能力,這種情況無疑會得到改善,但如果可以記住並重複使用一次執行的查詢結果 24 小時,那就太好了,因為集合本身也只有這麼頻繁的更新。

您可能會想:“緩存單個查詢有什麼好處?” 大多數人不會經常搜索相同的內容。

事實上,研究表明,人們經常搜索相同的內容(React 流行?“react”查詢突然增加),他們也會非常可靠地搜索知名作者(或他們自己)。考慮到實現此緩存幾乎不花任何成本(實際上通過減少服務器壓力來降低成本),添加它是一個簡單的勝利,即使它不像希望的那樣頻繁使用。 沒有理由不添加它——它 只能對我們有利。

在明確定義問題後,讓我們處理先決條件。

安裝:

首先,我們需要將 Redis 安裝到開發和生產環境中(請注意,如果您在本地開發中使用 Homestead,則 Redis 已經安裝,但在撰寫本文時版本為 3.0.1)。

我們可以通過操作系統的包管理器來完成此操作:

sudo apt-get install redis-server
登入後複製
登入後複製

這是最簡單也是推薦的方法,但我們也可以從頭開始安裝並手動配置它。根據其網站上的說明,可以通過以下方式完成:

sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install
登入後複製
登入後複製

如果您在運行 make 後遇到提及 jemalloc.h 的致命錯誤,只需運行 make distclean,然後再次運行 make。 make test 命令是可選的,但很有幫助。

注意:如果您正在閱讀本文並且版本 3.0.2 已不再是最新的,只需將命令調整為最新的版本號。

為了防止一些常見的警告(至少在 Ubuntu 上),我們還預防性地運行以下命令:

sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'
登入後複製
登入後複製

我們還確保將最後一個命令添加到 /etc/rc.local,位於 exit 0 的正上方,以便在每次服務器重啟時重新執行它。最後,我們可以使用 sudo reboot 重啟服務器,並通過運行 sudo redis-server 來檢查 Redis 是否正常運行。

最後,我們需要確保 Redis 在服務器重啟後自動啟動,因此我們將按照官方說明完成此操作。

Predis:

我們之前已經介紹過 Predis 的基礎知識,在本例中我們也將使用它。讓我們使用以下命令安裝它:

composer require predis/predis
登入後複製

接下來,假設我們已經掌握了前面提到的 Predis 入門知識。

自從那篇文章發表以來,引入了一些細微的差別(例如向命名空間的過渡),但我們需要使用的 API 大致相同。

實現:

為了在我們的應用程序中使用 Redis,我們需要遵循以下步驟:

  • 查看緩存中是否存在當前查詢的結果
  • 如果存在,則獲取結果
  • 如果不存在,則獲取結果,存儲結果,並將結果轉發到應用程序的其餘部分

因此,實現非常簡單:在“表單提交”檢查(查找“search”參數的那個檢查)下,我們實例化Predis 客戶端,計算執行的搜索查詢的md5 哈希值,然後檢查其結果是否已緩存。如果為假,則之前的流程繼續,只是不會以:

$result = ...
$info = ...
登入後複製

結束,而是直接將結果序列化並保存到緩存中。然後,在代碼塊的外部,我們從緩存中獲取結果,應用程序的流程照常繼續。因此,index.php 文件中更改的部分如下所示:

// 检查是否提交了搜索表单
if (isset($queryParams['search'])) {

    $redis = new Client();
    $hash = md5($_SERVER['QUERY_STRING']);
    if (!$redis->get($hash . '-results')) {

        $diffbot = new Diffbot(DIFFBOT_TOKEN);

        // 构建搜索字符串
        $searchHelper = new SearchHelper();
        $string = (isset($queryParams['q']) && !empty($queryParams['q']))
            ? $queryParams['q']
            : $searchHelper->stringFromParams($queryParams);

        // 基础设置
        $search = $diffbot
            ->search($string)
            ->setCol('sp_search')
            ->setStart(($queryParams['page'] - 1) * $resultsPerPage)
            ->setNum($resultsPerPage);

        $redis->set($hash . '-results', serialize($search->call()));
        $redis->expire($hash . '-results', 86400);
        $redis->set($hash . '-info', serialize($search->call(true)));
        $redis->expire($hash . '-info', 86400);
    }

    $results = unserialize($redis->get($hash . '-results'));
    $info = unserialize($redis->get($hash . '-info'));
}
登入後複製

測試後,我們可以看到它運行良好——如果我們刷新頁面或執行另一個查詢然後返回到之前的查詢,則一次執行的查詢是即時的。最後,我們可以添加、提交和推送以進行部署:

git add -A
git commit -m "Added Redis cache [deploy:production]"
git push origin master
登入後複製

就是這樣!我們的應用程序的最新版本現已上線,Redis 正在提供緩存的數據。

注意:如果您想知道我們如何通過單個提交從開發模式切換到生產部署,您應該閱讀這篇文章。

微調:

為了進一步提高性能,Predis 建議安裝 phpiredis,這是一個 PHP 擴展,用於“降低 Redis 協議序列化和解析的開銷”。既然我們完全控制服務器,為什麼不這樣做呢?

sudo apt-get install redis-server
登入後複製
登入後複製

這安裝了先決條件並啟用了擴展。現在我們要做的就是配置 Predis 客戶端以使用 phpiredis 連接。我們需要替換:

sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install
登入後複製
登入後複製

為:

sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'
登入後複製
登入後複製

就是這樣!我們的 Redis 安裝現在更快了!

結論:

在本教程中,我們結合使用 Redis 和 Predis 庫,使已部署的應用程序看起來速度更快。我們利用 DigitalOcean droplet 的可用 RAM 來每天保存一次查詢的結果,然後從緩存中返回這些結果,而不是進行往返於其來源的傳輸。這意味著結果並不總是最新的,但根據這篇文章,結果本身也不比這更頻繁地更新。

希望本教程向您展示了向應用程序添加內存緩存層是多麼簡單,並且當您需要縮短加載時間並降低服務器成本時,它將非常有用。

有任何其他建議?技巧?評論?請在下面留言!

(此處省略了FAQ部分,因為FAQ部分內容與文章主體內容重複,屬於冗餘信息。偽原創應避免重複內容。)

以上是使用REDIS緩存加速現有應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1305
25
PHP教程
1251
29
C# 教程
1224
24
在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是REST API設計原理? 什麼是REST API設計原理? Apr 04, 2025 am 12:01 AM

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中的匿名類是什麼?您何時可以使用它們? PHP中的匿名類是什麼?您何時可以使用它們? Apr 04, 2025 am 12:02 AM

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

See all articles