node中Session持久化與Redis緩存

IC圖片目前的管理系統(tǒng)(搜索質(zhì)量評(píng)估芬探、電銷、云平臺(tái)厘惦、性能監(jiān)控偷仿、賬號(hào)體系、圖片爬蟲)都是基于node前后端全棧開(kāi)發(fā),數(shù)據(jù)存儲(chǔ)也用到mongodb炎疆、mysql、redis国裳,本文簡(jiǎn)單描述一下HTTP協(xié)議形入、cookie、session缝左、以及node項(xiàng)目中如何引入redis做session持久化亿遂。

HTTP協(xié)議和TCP/IP協(xié)議組中其它協(xié)議相同,用于客戶端和服務(wù)器端之間的通信渺杉,HTTP是一種無(wú)狀態(tài)協(xié)議蛇数,及協(xié)議本身不保存客戶端和服務(wù)端的通信狀態(tài),也就是說(shuō)在HTTP這個(gè)級(jí)別是越,協(xié)議不會(huì)對(duì)請(qǐng)求或響應(yīng)做持久化處理,當(dāng)然這也是為了更快的處理大量事務(wù)耳舅,確保協(xié)議的可伸縮性。

1.cookie

為了解決HTTP的無(wú)狀態(tài)倚评,引入了Cookie技術(shù)浦徊,Cookie技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫入cookie信息來(lái)控制客戶端的狀態(tài)

2.session

為了跟蹤客戶端的狀態(tài)天梧,服務(wù)器端借助于客戶端的cookie和后端存儲(chǔ)實(shí)現(xiàn)的會(huì)話狀態(tài)盔性。所以說(shuō),Session機(jī)制決定了當(dāng)前客戶只會(huì)獲取到自己的Session呢岗,而不會(huì)獲取到別人的Session冕香。

cookie

1.1 概述

在HTTP協(xié)議中,制定了Cookie機(jī)制后豫,用于實(shí)現(xiàn)客戶端和服務(wù)器之間的狀態(tài)共享悉尾。

  • Cookie是解決HTTP無(wú)狀態(tài)性的有效手段,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息挫酿。

  • Cookie是解決HTTP無(wú)狀態(tài)性的有效手段焕襟,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息。

  • Cookie是解決HTTP無(wú)狀態(tài)性的有效手段饭豹,服務(wù)器可以設(shè)置(set-cookie)或讀取cookie中所包含的信息鸵赖。

1.2 實(shí)現(xiàn)原理

Cookie定義了HTTP請(qǐng)求頭和HTTP響應(yīng)頭,客戶端和服務(wù)器端通過(guò)這些頭信息進(jìn)行狀態(tài)交互拄衰。

  • 客戶端第一次請(qǐng)求:服務(wù)器端如果需要記錄用戶信息它褪,才會(huì)在響應(yīng)信息中返回 Set-cookie 響應(yīng)頭

  • 客戶端會(huì)根據(jù)響應(yīng)頭存儲(chǔ)Cookie信息

  • 客戶端再次請(qǐng)求:會(huì)在請(qǐng)求頭上帶上存儲(chǔ)的cookie信息,服務(wù)端通過(guò)cookie信息識(shí)別用戶

image

1.3 cookie 類別

cookie 總是存儲(chǔ)在客戶端(通常指瀏覽器)翘悉,根據(jù)其存儲(chǔ)位置可以分為:內(nèi)存式cookie茫打、硬盤式cookie。

內(nèi)存式:存儲(chǔ)在內(nèi)存中,瀏覽器關(guān)閉后清除老赤,也非持久存儲(chǔ)(會(huì)話cookie)

  • cookie 不包含到期日期轮洋,則可視為會(huì)話 cookie。 會(huì)話 cookie 存儲(chǔ)在內(nèi)存中抬旺,決不會(huì)寫入磁盤弊予。 當(dāng)瀏覽器關(guān)閉時(shí),cookie 將從此永久丟失

硬盤式:保存在硬盤中开财,瀏覽器關(guān)閉后不會(huì)清除汉柒,除非手動(dòng)清除或到了過(guò)期時(shí)間,也叫持久存儲(chǔ)(持久cookie)责鳍。

  • cookie 包含到期日期碾褂,則可視為持久性 cookie。 在指定的到期日期历葛,cookie 將從磁盤中刪除

注:通常我們可以通過(guò) expires 到期時(shí)間來(lái)做區(qū)分

1.4 HTTP 協(xié)議中為 cookie 服務(wù)的首部字段

Set-cookie: 響應(yīng)首部字段正塌,開(kāi)始狀態(tài)管理所使用的Cookie信息

image
image

Cookie: 請(qǐng)求首部字段,服務(wù)端接收到的cookie信息

image

1.5 cookie-parser

cookie-parser是 node 中用于操作 cookie 的中間件恤溶,用法也比較簡(jiǎn)單传货。

安裝

image

參數(shù)說(shuō)明

response 設(shè)置的 cookie 信息會(huì)隨HTTP響應(yīng)頭中的set-cookie,返回給客戶端宏娄。

image
  • name:cookie 名

  • value:cookie 值(可以是 json 對(duì)象或字符串)

  • options:set-cookie選項(xiàng)问裕,[同上圖]

image

使用

image

session

概述

Session需要借助Cookie實(shí)現(xiàn),Session數(shù)據(jù)存儲(chǔ)在服務(wù)端孵坚,而只在Cookie中存儲(chǔ)一個(gè)SessionId粮宛,可以保證安全性和降低服務(wù)器負(fù)載。

express-session

express-session真正在服務(wù)端保存數(shù)據(jù)的中間件卖宠,它需要獨(dú)立安裝

安裝

image

引入

image

幾個(gè)常用的 options

[圖片上傳中...(image-6b0cf3-1525851935560-5)]

因?yàn)閯?chuàng)建 session 的同時(shí)會(huì)創(chuàng)建 cookie 來(lái)保存 sessionId巍杈,所以 options 中的 cookie.maxAge 可看作是 session 的有效時(shí)長(zhǎng)。

使用

image

redis

session存在的問(wèn)題:Session用于在服務(wù)端保存用戶會(huì)話狀態(tài)(如:用戶登錄信息等)扛伍,Session在程序重啟筷畦、多進(jìn)程運(yùn)行、負(fù)載均衡刺洒、跨域等情況時(shí)鳖宾,會(huì)出現(xiàn)Session丟失或多進(jìn)程、多個(gè)負(fù)載站點(diǎn)間狀態(tài)不能共享的情況

要解決這些問(wèn)題:我們需要將Session持久化存儲(chǔ)逆航,Redis存儲(chǔ)是一個(gè)非常不錯(cuò)的Session持久化解決方案

Redis是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)

3.1 概述

特點(diǎn)

  • Redis支持數(shù)據(jù)的持久化鼎文,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用因俐。

  • Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù)拇惋,同時(shí)還提供list周偎,set,zset撑帖,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)

  • Redis支持數(shù)據(jù)的備份蓉坎,即master-slave模式的數(shù)據(jù)備份

優(yōu)勢(shì)

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s

  • 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作

  • 原子 – Redis的所有操作都是原子性的胡嘿,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行

  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性

3.2 connect-redis

connect-redis是一個(gè) Redis 版的 session 存儲(chǔ)器蛉艾,使用node_redis作為驅(qū)動(dòng)。借助它即可在Express中啟用Redis來(lái)持久化你的Session灶平。

使用之前先搭建好redis環(huán)境和express應(yīng)用伺通,Mac下面非常簡(jiǎn)單箍土,參考:redis搭建Hello world 示例

安裝

image

參數(shù)說(shuō)明

client: 你可以復(fù)用現(xiàn)有的redis客戶端對(duì)象逢享, 由redis.createClient() 創(chuàng)建

host: Redis服務(wù)器名

port: Redis服務(wù)器端口

socket: Redis服務(wù)器的unix_socket

ttl: Redis session TTL 過(guò)期時(shí)間 (秒)

disableTTL: 禁用設(shè)置的 TTL

db: 使用第幾個(gè)數(shù)據(jù)庫(kù)

pass: Redis數(shù)據(jù)庫(kù)的密碼

prefix: 數(shù)據(jù)表前輟即schema, 默認(rèn)為 "sess:"

使用

image

此時(shí):你的session信息就轉(zhuǎn)移到redis數(shù)據(jù)庫(kù)了,當(dāng)應(yīng)用重啟后數(shù)據(jù)仍然可以通過(guò)cookie中的sessionid獲取到吴藻,做到數(shù)據(jù)持久化瞒爬,提高應(yīng)用的健壯性。當(dāng)然你可以嘗試存到其它數(shù)據(jù)庫(kù)里面沟堡,選擇redis在于它極高的性能侧但。

結(jié)語(yǔ)

不管是express-cookie、express-session航罗、connect-redis 都只是node的中間件禀横,使用都非常簡(jiǎn)單,關(guān)鍵點(diǎn)在于理解其中的原理粥血,在不同場(chǎng)景都能很好的應(yīng)用柏锄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市复亏,隨后出現(xiàn)的幾起案子趾娃,更是在濱河造成了極大的恐慌,老刑警劉巖缔御,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抬闷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耕突,警方通過(guò)查閱死者的電腦和手機(jī)笤成,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)眷茁,“玉大人疹启,你說(shuō)我怎么就攤上這事“ǎ” “怎么了喊崖?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵挣磨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荤懂,道長(zhǎng)茁裙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任节仿,我火速辦了婚禮晤锥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廊宪。我一直安慰自己矾瘾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布箭启。 她就那樣靜靜地躺著壕翩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傅寡。 梳的紋絲不亂的頭發(fā)上放妈,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音荐操,去河邊找鬼芜抒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛托启,可吹牛的內(nèi)容都是我干的宅倒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屯耸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拐迁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肩民,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唠亚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后持痰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灶搜,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年工窍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了割卖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡患雏,死狀恐怖鹏溯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淹仑,我是刑警寧澤丙挽,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布肺孵,位于F島的核電站,受9級(jí)特大地震影響颜阐,放射性物質(zhì)發(fā)生泄漏平窘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一凳怨、第九天 我趴在偏房一處隱蔽的房頂上張望瑰艘。 院中可真熱鬧,春花似錦肤舞、人聲如沸紫新。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芒率。三九已至,卻和暖如春杖爽,著一層夾襖步出監(jiān)牢的瞬間敲董,已是汗流浹背紫皇。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工慰安, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聪铺。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓化焕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铃剔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撒桨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來(lái)跟蹤用戶的整個(gè)會(huì)話键兜。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,605評(píng)論 1 49
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理凤类,服務(wù)發(fā)現(xiàn),斷路器普气,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,940評(píng)論 7 186
  • 背景在HTTP協(xié)議的定義中谜疤,采用了一種機(jī)制來(lái)記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie现诀,cooki...
    時(shí)芥藍(lán)閱讀 2,357評(píng)論 1 17
  • 2月6日精進(jìn)夷磕。今日體驗(yàn)。維修中發(fā)現(xiàn)問(wèn)題及時(shí)處理仔沿,尋求解決辦法坐桩,根據(jù)情況進(jìn)行檢查,核心封锉。維修中不要慌亂绵跷。要穩(wěn)膘螟。轉(zhuǎn)身用...
    呂志剛l閱讀 141評(píng)論 0 0