angularjs 緩存詳解

来源:https://www.cnblogs.com/chaixiaozhi/archive/2018/03/18/8596738.html
-Advertisement-
Play Games

一、什麼是緩存 一個緩存就是一個組件,它可以透明地存儲數據,以便未來可以更快地服務於請求。 緩存能夠服務的請求越多,整體系統性能就提升得越多。 二、Angular 中的緩存 2.1 $cacheFactory 簡介 $cacheFactory 是一個為所有Angular服務生成緩存對象的服務。在內部 ...


一、什麼是緩存

一個緩存就是一個組件,它可以透明地存儲數據,以便未來可以更快地服務於請求。

緩存能夠服務的請求越多,整體系統性能就提升得越多。

 

二、Angular 中的緩存

2.1 $cacheFactory 簡介

$cacheFactory 是一個為所有Angular服務生成緩存對象的服務。在內部, $cacheFactory 會創建一個預設的緩存對象,即使我們並沒有顯示地創建。

要創建一個緩存對象,可以使用 $cacheFactory 通過一個ID創建一個緩存:

var cache = $cacheFactory('myCache');

這個 $cacheFactory 方法可以接受兩個參數:

cacheId (字元串):這個 cacheId 就是創建緩存時的ID名稱。可以通過 get() 方法使用緩存名稱來引用它。

capacity :這個容量描述了在任何給定時間要使用緩存存儲並保存的緩存鍵值對的最大數量。

 

2.2 緩存對象

緩存對象自身有下列這些方法可以用來與緩存交互。
info() : info() 方法返回緩存對象的ID、尺寸和選項。
put() : put() 方法允許我們把任意JavaScript對象值形式的鍵(字元串)放進緩存中。cache.put("hello","world");
put() 方法會返回我們放入緩存中的值。
get() : get() 方法讓我們能夠訪問一個鍵對應的緩存值。如果找到了這個鍵,它會返回它的值;如果沒有找到,它會返回 undefined 。cache.get("hello");
remove() : remove() 函數用於在找到一個鍵值對的情況下從緩存中移除它。如果沒有找到,它就會返回 undefined 。cache.remove("hello");
removeAll() : removeAll() 函數用於重置緩存,同時移除所有已緩存的值。
destory() : destory() 方法用於從 $cacheFactory 緩存註冊表中移除指定緩存的所有引用。

 

三、$http 中的緩存

Angular的 $http 服務創建了一個帶有ID為 $http 的緩存。要讓 $http 請求使用預設的緩存對象很簡單: $http() 方法允許我們給它傳遞一個 cache 參數。

 3.1 預設的 $http 緩存
當數據不會經常改變時,預設的 $http 緩存就特別有用了。可以像這樣設置它:

$http({
    method: 'GET',
    url: '/api/users.json',
    cache: true  //設置為true只是用來使用$http預設的緩存機制
});

現在,通過 $http 到URL /api/user.json 的每個請求將會存儲到預設的 $http 緩存中。這個$http 緩存中的請求鍵就是完整的URL路徑。

 

如果需要,也可以操作這個預設的 $http 緩存(比如,如果我們發起的另外一個沒有緩存的請求提醒我們發生了增量變化,我們就可以在預設的 $http 請求中清除這個請求)。

為了引用 $http 的預設請求,只需通過 $cacheFactory() 使用ID來獲取到該緩存:
var cache = $cacheFactory('$http');
對於所掌控的緩存,我們可以在需要時進行所有的正常操作,比如檢索已緩存的響應,從緩存中清除條目,或者消除所有緩存的引用。
// 獲取上一次請求的緩存 var usersCache = cache.get('http://example.com/api.users.json'); // 刪除上一次請求的緩存入口 cache.remove('http://example.com/api.users.json'); // 重新開始並移除全部緩存 cache.removeAll();
        var cache = $cacheFactory.get('$http');
        if(cache.get('cacheData')){
            console.log(cache.get('cacheData'));
        }else{
            helloService.play().then(
                function (data) {
                    cache.put("cacheData", data);  //往緩存中放入數據
                    console.log(data);
                }
            );
        }

 

 3.2 自定義緩存

有時候能夠對緩存有更多的控制以及針對緩存的表現創建規則,這就需要創建一個新的緩存來使用 $http 請求。

通過自定義的緩存來讓 $http 請求發起請求很簡單。可以採用傳遞緩存實例的方式,而不必傳遞一個布爾參數 true 給請求。

var myCache = $cacheFactory('myCache');
$http({
  method: 'GET',
  utl: '/api/users.json',
  cache: myCache
});

一個小demo:定義一個緩存服務,依賴註入到你要用的控制器中,直接使用

define([
   'angularModule'
],function(app){
    app.factory('myCache', ['$cacheFactory', function($cacheFactory){
        return $cacheFactory('myCache');  //自定義一個緩存服務
    }])
});
 
        //自定義緩存,有緩存就從緩存里取,否則就發送請求
        if(myCache.get('cacheData')){
            console.log(myCache.get('cacheData'));
        }else{
            helloService.play(myCache).then(
                function (data) {
                    myCache.put("cacheData", data);
                    console.log(data);
                }
            );
        }
            cache:只是為了可以使用預設$http的緩存機制
            play : function (myCache) {
                return httpRequestService.request({
                    method : 'get',
                    url : 'http://localhost:8080/hello/play',
                    cache : myCache
                })
            }

 現在, $http 將會使用自定義的緩存而非預設緩存。

 

四、為 $http 設置預設緩存

每次我們想要發起一個 $http 請求時都要給它傳遞一個緩存實例並不方便,特別是對每個請求使用同一緩存的時候。

其實可以在模塊的 .config() 方法中通過 $httpProvider 設置 $http 預設使用的緩存對象。

angular.module('myApp', []).config(function($httpProvider) {
  $httpProvider.defaults.cache = $cacheFactory('myCache', {capacity: 20});
});

這個 $http 服務不再使用它為我們創建的預設緩存;它會使用我們自定義的緩存,實際上這就是一個近期緩存最久未使用演算法① (Least Recently Used,LRU)。

LRU緩存根據緩存容量只保留最新的緩存數目。也就是說,我們的緩存容量為20,因此會緩存前20個請求,但是進入第21個請求時,最近最少使用的請求條目就會從緩存中被刪除。這個緩存自身會負責具體哪些要維護,哪些要移除。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前置環境 需要JAVA環境,如果沒有配置JAVA 環境,點下麵鏈接按教程進行配置: Java開發環境搭建:http://www.cnblogs.com/magisk/p/8496396.html 所需要的工具 1、apktool,功能:反編譯出apk所需要的資源文件和佈局設置文件等, 下載地址:ht ...
  • GitHub地址(歡迎下載完整Demo) https://github.com/ganchuanpu/AOPDemo 項目需求描述 我想類似於這樣的個人中心的界面,大家都不會陌生吧。那幾個有箭頭的地方都是可以點擊進行頁面跳轉的,但是需要先判斷用戶是否登錄,如果已經登錄,則正常跳轉,如果沒有登錄,則跳 ...
  • 第3章 計劃3.1 初始探索 在項目開始時,開發人員會和客戶商討一下關於新系統的情況,以確定出所有真正重要的信息。然而,他們不會試圖去確定所有的特性。隨著項目的進展,客戶會不斷的發現新的特性。特性發現的過程會一直持續到項目完成。 當識別出一個特性時,會把它分解成一個或者多個用戶故事,並把這些用戶故事 ...
  • vscode是微軟開發的的一款代碼編輯器,就如官網上說的一樣,vscode重新定義(redefined)了代碼編輯器。當前市面上常用的輕型代碼編輯器主要是:sublime,notepad++,editplus,atom這幾種。比起notepad++、editplus,vscode集成了許多IDE才具 ...
  • vue 點我 ... ...
  • 腳本語言最重要的幾個部分: 數據類型 運算符 控制語句 數組 方法(函數) 一、基礎知識 關鍵字:系統定義 有意義的名字如 background link 等 標識符:自己定 比如class的名字aa 變數:可以看作儲存數據的容器,名字必須用字母開頭,對大小寫敏感。定義後可多次賦值 傳值賦值。 定義 ...
  • 1.寫HTML 訪問方式: http://localhost:8080/myweb/hellow.html (註意:8080埠要加上) 本地電腦:(HP-PC) D:\tomact\webapps\myweb(網頁寫到這裡) ...
  • 上圖是今天下午5個小時的解決成果 1:安裝軟體要耐心,此次安裝軟體第一個星期安裝時正常是可以用的接著不能用了第二個星期,然後我天天就想為什麼,其實不然也沒事嗎,可能軟體太多導致, 最終感覺還是基礎功不牢固而導致的;第二個星期天最後一天的晚上19.32裝好的; 2.開始安裝,對於我們開發者來說java ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...