Web存儲方案

如何選擇季二?

客戶端存儲無非就是 Cookie、SessionStorage舀寓、LocalStorage、IndexedDB肌蜻、WebSQL 這些互墓,從一定程度上來說怎么存儲都是可以的,只是你覺得怎么方便蒋搜,就怎么存儲

Cookie

HTTP Cookie(也叫 Web Cookie 或瀏覽器 Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)篡撵,它會在瀏覽器下次向同一服務(wù)器再發(fā)起請求時被攜帶并發(fā)送到服務(wù)器上。通常豆挽,它用于告知服務(wù)端兩個請求是否來自同一瀏覽器育谬,如保持用戶的登錄狀態(tài)。

Cookie 主要用于以下三個方面:

  • 會話狀態(tài)管理(如用戶登錄狀態(tài)帮哈、購物車膛檀、游戲分?jǐn)?shù)或其它需要記錄的信息);
  • 個性化設(shè)置(如用戶自定義設(shè)置娘侍、主題等)咖刃;
  • 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)。

Cookie 的特點:

  • Cookie 的大小受限憾筏,一般為 4 KB嚎杨;
  • 同一個域名下存放 Cookie 的個數(shù)是有限制的,不同瀏覽器的個數(shù)不一樣氧腰,一般為 20 個枫浙;
  • Cookie 支持設(shè)置過期時間,當(dāng)過期時自動銷毀容贝;
  • 每次發(fā)起同域下的 HTTP 請求時自脯,都會攜帶當(dāng)前域名下的 Cookie;
  • 支持設(shè)置為 HttpOnly斤富,防止 Cookie 被客戶端的 JavaScript 訪問膏潮。
// 簡單用法
document.cookie = "name=semlinker";
document.cookie = "favorite_food=tripe";

alert(document.cookie);
// 顯示: name=semlinker;favorite_food=tripe

localStorage

一種持久化的存儲方式,也就是說如果不手動清除满力,數(shù)據(jù)就永遠(yuǎn)不會過期焕参。它是采用鍵值對的方式存儲數(shù)據(jù)轻纪,按域名將數(shù)據(jù)分別保存到對應(yīng)數(shù)據(jù)庫文件里。相比 Cookie 來說叠纷,它能保存更大的數(shù)據(jù)刻帚。

localStorage 的特點:

  • 大小限制為 5MB ~10MB;
  • 在同源的所有標(biāo)簽頁和窗口之間共享數(shù)據(jù)涩嚣;
  • 數(shù)據(jù)僅保存在客戶端崇众,不與服務(wù)器進(jìn)行通信;
  • 數(shù)據(jù)持久存在且不會過期航厚,重啟瀏覽器后仍然存在顷歌;對數(shù)據(jù)的操作是同步的。
// 通過setItem()增加一個數(shù)據(jù)項
localStorage.setItem('myName', 'Semlinker');

// 通過getItem()獲取某個數(shù)據(jù)項
let me = localStorage.getItem('myName');

// 通過removeItem()移除某個數(shù)據(jù)項
localStorage.removeItem('myName');

// 移除所有數(shù)據(jù)項
localStorage.clear();

sessionStorage

與服務(wù)端的 session 類似幔睬,sessionStorage 是一種會話級別的緩存眯漩,關(guān)閉瀏覽器時數(shù)據(jù)會被清除。需要注意的是 sessionStorage 的作用域是窗口級別的麻顶,也就是說不同窗口之間保存的 sessionStorage 數(shù)據(jù)是不能共享的赦抖。

sessionStorage 的特點:

  • sessionStorage 的數(shù)據(jù)只存在于當(dāng)前瀏覽器的標(biāo)簽頁;
  • 數(shù)據(jù)在頁面刷新后依然存在辅肾,但在關(guān)閉瀏覽器標(biāo)簽頁之后數(shù)據(jù)就會被清除队萤;
  • 與 localStorage 擁有統(tǒng)一的 API 接口;
  • 對數(shù)據(jù)的操作是同步的宛瞄。
// 通過setItem()增加一個數(shù)據(jù)項
sessionStorage.setItem('myName', 'Semlinker');

// 通過getItem()獲取某個數(shù)據(jù)項
let me = sessionStorage.getItem('myName');

// 通過removeItem()移除某個數(shù)據(jù)項
sessionStorage.removeItem('myName');

// 移除所有數(shù)據(jù)項
sessionStorage.clear();

IndexedDB

IndexedDB 是一種底層 API浮禾,用于客戶端存儲大量結(jié)構(gòu)化數(shù)據(jù),包括文件份汗、二進(jìn)制大型對象盈电。該 API 使用索引來實現(xiàn)對該數(shù)據(jù)的高性能搜索。雖然 Web Storage 對于存儲較少量的數(shù)據(jù)很有用杯活,但對于存儲更大量的結(jié)構(gòu)化數(shù)據(jù)來說匆帚,這種方法不太好用。IndexedDB 提供了一個解決方案旁钧。

IndexedDB 的特點:

  • 存儲空間大:存儲空間可以達(dá)到幾百兆甚至更多吸重;
  • 支持二進(jìn)制存儲:它不僅可以存儲字符串,而且還可以存儲二進(jìn)制數(shù)據(jù)歪今;
  • IndexedDB 有同源限制嚎幸,每一個數(shù)據(jù)庫只能在自身域名下能訪問,不能跨域名訪問寄猩;
  • 支持事務(wù)型:IndexedDB 執(zhí)行的操作會按照事務(wù)來分組的嫉晶,在一個事務(wù)中,要么所有的操作都成功,要么所有的操作都失斕娣稀箍铭;
  • 鍵值對存儲:IndexedDB 內(nèi)部采用對象倉庫(object store)存放數(shù)據(jù)。所有類型的數(shù)據(jù)都可以直接存入椎镣,包括 JavaScript 對象诈火。對象倉庫中,數(shù)據(jù)以 “鍵值對” 的形式保存状答,每一個數(shù)據(jù)記錄都有對應(yīng)的主鍵冷守,主鍵是獨一無二的,不能有重復(fù)剪况,否則會拋出一個錯誤教沾;
  • 數(shù)據(jù)操作是異步的:使用 IndexedDB 執(zhí)行的操作是異步執(zhí)行的,以免阻塞應(yīng)用程序译断。
// 示例
var dbName = "my_db";

var request = indexedDB.open(dbName, 2);

request.onerror = function(event) {
  // 錯誤處理
};

request.onupgradeneeded = function(event) {
  var db = event.target.result;

  // 建立一個對象倉庫來存儲我們客戶的相關(guān)信息,我們選擇 ssn 作為鍵路徑(key path)
  // 因為 ssn 可以保證是不重復(fù)的
  var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

  // 建立一個索引來通過姓名來搜索客戶或悲。名字可能會重復(fù)孙咪,所以我們不能使用 unique 索引
  objectStore.createIndex("name", "name", { unique: false });

  // 使用郵箱建立索引,我們確毖灿铮客戶的郵箱不會重復(fù)翎蹈,所以我們使用 unique 索引
  objectStore.createIndex("email", "email", { unique: true });

  // 使用事務(wù)的 oncomplete 事件確保在插入數(shù)據(jù)前對象倉庫已經(jīng)創(chuàng)建完畢
  objectStore.transaction.oncomplete = function(event) {
    // 將數(shù)據(jù)保存到新創(chuàng)建的對象倉庫
    var customerObjectStore = db.transaction("customers", "readwrite").objectStore("customers");
    customerData.forEach(function(customer) {
      customerObjectStore.add(customer);
    });
  };
};

Web SQL

Web SQL 數(shù)據(jù)庫 API 實際上不是 HTML5 規(guī)范的一部分,而是一個單獨的規(guī)范男公,它引入了一組 API 來使用 SQL 來操作客戶端數(shù)據(jù)庫荤堪。需要注意的是,HTML5 已經(jīng)放棄 Web SQL 數(shù)據(jù)庫枢赔。

Web SQL Database 規(guī)范中定義的三個核心方法:

  1. openDatabase:這個方法使用現(xiàn)有數(shù)據(jù)庫或新建數(shù)據(jù)庫來創(chuàng)建數(shù)據(jù)庫對象澄阳;
  2. transaction:這個方法允許我們根據(jù)情況控制事務(wù)的提交或回滾;
  3. executeSql:這個方法用于執(zhí)行真實的 SQL 語句踏拜。

Web SQL 的特點(相比 Cookie碎赢、localStorage 與 sessionStorage):

  • Web SQL 能方便進(jìn)行對象存儲;
  • Web SQL 支持事務(wù)速梗,能方便地進(jìn)行數(shù)據(jù)查詢和數(shù)據(jù)處理操作肮塞。
// 示例
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);

db.transaction(function (tx) { 
   // 執(zhí)行查詢操作
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
   // 執(zhí)行插入操作
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")'); 
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")'); 
}); 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姻锁,隨后出現(xiàn)的幾起案子枕赵,更是在濱河造成了極大的恐慌,老刑警劉巖位隶,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機装黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門副瀑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恋谭,你說我怎么就攤上這事糠睡。” “怎么了疚颊?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵狈孔,是天一觀的道長。 經(jīng)常有香客問我材义,道長均抽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任其掂,我火速辦了婚禮油挥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘款熬。我一直安慰自己深寥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布贤牛。 她就那樣靜靜地躺著惋鹅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殉簸。 梳的紋絲不亂的頭發(fā)上闰集,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音般卑,去河邊找鬼武鲁。 笑死,一個胖子當(dāng)著我的面吹牛椭微,可吹牛的內(nèi)容都是我干的洞坑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝇率,長吁一口氣:“原來是場噩夢啊……” “哼迟杂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起本慕,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤排拷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锅尘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监氢,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡布蔗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浪腐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵揍。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖议街,靈堂內(nèi)的尸體忽然破棺而出泽谨,到底是詐尸還是另有隱情,我是刑警寧澤特漩,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布吧雹,位于F島的核電站,受9級特大地震影響涂身,放射性物質(zhì)發(fā)生泄漏雄卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一蛤售、第九天 我趴在偏房一處隱蔽的房頂上張望丁鹉。 院中可真熱鬧,春花似錦悍抑、人聲如沸鳄炉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佑女,卻和暖如春记靡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背团驱。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工摸吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚎花。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓寸痢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紊选。 傳聞我的和親對象是個殘疾皇子啼止,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容