<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 2018 年 12 月 4 日 發布 大部分`ThinkPHP`應用都可以簡單通過緩存提升應用性能,本文就來總結下`ThinkPHP`的數據緩存使用和注意事項。 >[info] 這里說的緩存僅針對應用的數據緩存,不包含系統的緩存優化設置的使用(可以參考之前的[如何有效提高ThinkPHP的應用性能](https://blog.thinkphp.cn/843679)一文)。 `ThinkPHP5`的應用數據緩存主要包含三塊:數據緩存、查詢緩存和請求緩存。 ## 數據緩存 如果你有些場景對數據的實時性要求并不高,那么選擇數據緩存是一個很好的解決辦法,數據緩存指的是直接通過`Cache`類管理緩存,例如下面是一個簡單的例子。 ~~~ use think\facade\Cache; if (Cache::has('user_data')) { $users = Cache::get('user_data') } else { $users = User::where('score', '>', 100)->select(); // 緩存用戶數據30秒 Cache::set('user_data', $users, 30); } ~~~ 緩存的配置通過`config/cache.php`文件配置。 事實上,上面的查詢代碼可以簡化成: ``` $users = Cache::remember('user_data', function(){ return User::where('score', '>', 100)->select(); },30); ``` >[danger] 為了避免緩存寫入失敗的并發問題,`remember`方法默認會自動增加緩存鎖機制。 如果你希望獲取一次緩存數據后就立刻刪除該緩存,可以使用`pull`方法。 ``` $users = User::where('score', '>', 100)->select(); // 緩存用戶數據30秒 Cache::set('user_data', $users, 30); // 獲取緩存數據后刪除 $users = Cache::pull('user_data'); ``` 更多的緩存操作可以參考官方手冊的[緩存章節](http://www.hmoore.net/manual/thinkphp5_1/354116)。 >[info] 要發揮緩存的優勢,關鍵還在于緩存類型的合理選擇,尤其在高并發的情況下,你需要選擇分布式緩存類型。而且有時候選擇數據庫類型作為緩存機制并不會比文件緩存性能低,尤其是使用內存表的話。目前`Redis`作為緩存甚至和數據庫同步的方案已經是較為常見,網上有很多相關的文章。 ## 查詢緩存 查詢緩存是專門針對數據庫查詢而設計的一種緩存簡化策略,不需要添加復雜的代碼,可以更簡單的實現數據查詢的數據緩存。代碼改造量也相對較小,只需要給你的查詢或者寫操作添加一個`cache`鏈式方法,例如上面的數據緩存代碼使用查詢緩存方式可以改成: ``` $users = User::where('score', '>', 100) ->cache('user_data', 30) ->select(); ``` >[info] 查詢緩存支持所有的查詢操作,不僅是`find`,也包括`select`/`find`/`value`/`column`方法以及衍生方法。 一旦你的查詢中使用了`cache`方法并開啟了查詢緩存,系統在進行實際的數據庫查詢之前會首先檢查緩存數據是否有效,如果有效則直接返回而不再查詢,如果查詢緩存不存在或者無效則會在本次查詢后對查詢結果進行緩存。 `cache`方法其實有三個參數,最簡單是用法是只傳入一個`true`,表示開啟查詢緩存,緩存有效期則使用系統的緩存設置。 ``` // 查詢緩存的有效期使用系統設置 $user = User::where('id', 10) ->cache(true) ->find(); ``` 如果你需要設置緩存有效期,可以使用 ``` // 查詢緩存30秒有效 $user = User::where('id', 10) ->cache(30) ->find(); ``` 你還可以設置一個緩存失效時間 ``` // 查詢緩存將在2019-1-1 失效 $expireTime = new \DateTime('2019-01-01'); $user = User::where('id', 10) ->cache($expireTime) ->find(); ``` 如果你需要在查詢外部操作緩存數據,可以設置一個緩存Key ``` // 設置查詢緩存的Key $user = User::where('id', 10) ->cache('user_cache', 30) ->find(); // 在查詢外部操作緩存 $user = Cache::get('user_cache'); Cache::rm('user_cache'); ``` >[danger] 推薦自己設置緩存`key`的方式使用查詢緩存,好處是可以減少緩存標識的生成開銷提高性能,而且可以在外部操作緩存。 查詢緩存目前不支持關聯模型的數據自動緩存,如果你需要緩存關聯模型的數據,需要使用數據緩存把整體的查詢結果緩存起來,可以使用下面的代碼: ``` $users = Cache::remember('users', function(){ return User::with('profile') ->where('status', 1) ->select(); },30); ``` ### 緩存自動更新 緩存數據的自動更新是緩存管理的一個難點,但對于一些規范的查詢緩存,框架已經幫你實現了數據變化的時候自動更新緩存。 這里的緩存自動更新是指一旦數據更新或者刪除后會自動清理緩存(下次獲取的時候會自動重新緩存)。 自動更新規則一,當你在使用查詢緩存后,當刪除或者更新數據的時候,可以通過調用相同緩存`key`的`cache`方法,則會自動更新(清除)緩存,例如: ~~~ $users = User::cache('user_data')->select([1,3,5]); User::cache('user_data') ->where('id', 1) ->update(['name'=>'thinkphp']); $users = User::cache('user_data')->select([1,5]); ~~~ 雖然使用了相同的緩存標識`user_data`,但最后查詢的數據不會受第一條查詢緩存的影響,最終的查詢緩存會變成第二次查詢的結果。 >[danger] 這種方式的緩存自動更新適用于所有的查詢方法,但必須確保查詢和更新或者刪除使用相同的緩存標識才能自動清除緩存。 自動更新規則二,如果使用`find`/`get`方法并且使用主鍵查詢的情況,不需要指定緩存標識,會自動清理緩存,例如: ~~~ User::cache(true)->find(1); User::where('id', 1)->update(['name'=>'thinkphp']); User::cache(true)->find(1); ~~~ 如果是基于主鍵的查詢緩存,發生數據變化的時候會自動更新緩存,而且更新的時候無需指定`cache`方法。 ## 請求緩存 數據緩存和查詢緩存只是緩存了部分數據,控制器的執行邏輯開銷依然存在,請求緩存則更進一步,可以緩存當前請求的整個響應輸出的頁面(僅對`GET`請求類型有效)。 可以在路由規則里面調用`cache`方法設置當前路由規則的請求緩存,例如: ~~~ // 定義GET請求路由規則 并設置3600秒的緩存 Route::get('new/:id','News/read')->cache(3600); ~~~ 第二次訪問相同的路由地址的時候,會自動獲取請求緩存的數據響應輸出,并發送`304`狀態碼。 如果你沒有使用路由或者只定義了部分路由的話,可以通過設置全局請求緩存,并支持設置排除規則,在`app.php`文件中增加配置定義如下: ~~~ 'request_cache' => true, 'request_cache_expire' => 3600, 'request_cache_except' => [ // 排除列表和user模塊 '/blog/index', '/user', ], ~~~ 排除規則里面只需要設置不使用請求緩存的地址的開頭部分(不區分大小寫)。 >[info] 路由中設置的請求緩存依然有效并且優先,如果需要設置特殊的請求緩存有效期就可以直接在路由中設置。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看