如何在node項目中引入redis做session持久化?
IC圖片目前的管理系統(搜索質量評估、電銷、雲平台、性能監控、賬號體系、圖片爬蟲)都是基於node前後端全棧開發,數據存儲也用到mongodb、mysql、redis,本文簡單描述一下HTTP協議、cookie、session、以及node項目中如何引入redis做session持久化。
HTTP協議和TCP/IP協議組中其它協議相同,用於客戶端和伺服器端之間的通信,HTTP是一種無狀態協議,及協議本身不保存客戶端和服務端的通信狀態,也就是說在HTTP這個級別,協議不會對請求或響應做持久化處理,當然這也是為了更快的處理大量事務,確保協議的可伸縮性。
cookie
為了解決HTTP的無狀態,引入了Cookie技術,Cookie技術通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態。
session
為了跟蹤客戶端的狀態,伺服器端藉助於客戶端的cookie和後端存儲實現的會話狀態。所以說,Session機制決定了當前客戶只會獲取到自己的Session,而不會獲取到別人的Session。
1 cookie1.1 概述
在HTTP協議中,制定了Cookie機制,用於實現客戶端和伺服器之間的狀態共享。
Cookie是解決HTTP無狀態性的有效手段,伺服器可以設置(set-cookie)或讀取cookie中所包含的信息。
Cookie是解決HTTP無狀態性的有效手段,伺服器可以設置(set-cookie)或讀取cookie中所包含的信息。
Cookie是解決HTTP無狀態性的有效手段,伺服器可以設置(set-cookie)或讀取cookie中所包含的信息。
1.2實現原理
Cookie定義了HTTP請求頭和HTTP響應頭,客戶端和伺服器端通過這些頭信息進行狀態交互。
客戶端第一次請求:伺服器端如果需要記錄用戶信息,才會在響應信息中返回 Set-cookie 響應頭
客戶端會根據響應頭存儲Cookie信息
客戶端再次請求:會在請求頭上帶上存儲的cookie信息,服務端通過cookie信息識別用戶
1.3cookie 類別
cookie 總是存儲在客戶端(通常指瀏覽器),根據其存儲位置可以分為:內存式cookie、硬碟式cookie。
內存式:存儲在內存中,瀏覽器關閉後清除,也非持久存儲(會話cookie)
cookie 不包含到期日期,則可視為會話 cookie。 會話 cookie 存儲在內存中,決不會寫入磁碟。 當瀏覽器關閉時,cookie 將從此永久丟失
硬碟式:保存在硬碟中,瀏覽器關閉後不會清除,除非手動清除或到了過期時間,也叫持久存儲(持久cookie)。
cookie 包含到期日期,則可視為持久性 cookie。 在指定的到期日期,cookie 將從磁碟中刪除
註:通常我們可以通過 expires 到期時間來做區分
1.4HTTP 協議中為 cookie 服務的首部欄位
Set-cookie: 響應首部欄位,開始狀態管理所使用的Cookie信息
Cookie: 請求首部欄位,服務端接收到的cookie信息
1.5 cookie-parser
cookie-parser是 node 中用於操作 cookie 的中間件,用法也比較簡單。
安裝
參數說明
response 設置的 cookie 信息會隨HTTP響應頭中的set-cookie,返回給客戶端。
name:cookie 名
value:cookie 值(可以是 json 對象或字元串)
options:set-cookie選項,[同上圖]
使用
session概述
Session需要藉助Cookie實現,Session數據存儲在服務端,而只在Cookie中存儲一個SessionId,可以保證安全性和降低伺服器負載。
express-session
express-session真正在服務端保存數據的中間件,它需要獨立安裝
安裝
引入
幾個常用的 options
因為創建 session 的同時會創建 cookie 來保存 sessionId,所以 options 中的 cookie.maxAge 可看作是 session 的有效時長。
使用
session存在的問題:Session用於在服務端保存用戶會話狀態(如:用戶登錄信息等),Session在程序重啟、多進程運行、負載均衡、跨域等情況時,會出現Session丟失或多進程、多個負載站點間狀態不能共享的情況
要解決這些問題:我們需要將Session持久化存儲,Redis存儲是一個非常不錯的Session持久化解決方案
Redis是一個高性能的key-value資料庫
3.1 概述
特點
Redis支持數據的持久化,可以將內存中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲
Redis支持數據的備份,即master-slave模式的數據備份
優勢
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
豐富的數據類型 – Redis支持二進位案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並後的原子性執行
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性
3.2 connect-redis
connect-redis是一個 Redis 版的 session 存儲器,使用node_redis作為驅動。藉助它即可在Express中啟用Redis來持久化你的Session。
使用之前先搭建好redis環境和express應用,Mac下面非常簡單,參考:redis搭建/Hello world 示例
安裝
參數說明
client: 你可以復用現有的redis客戶端對象, 由redis.createClient() 創建
host: Redis伺服器名
port: Redis伺服器埠
socket: Redis伺服器的unix_socket
ttl: Redis session TTL 過期時間 (秒)
disableTTL: 禁用設置的 TTL
db: 使用第幾個資料庫
pass: Redis資料庫的密碼
prefix: 數據表前輟即schema, 默認為 "sess:"
使用
此時:你的session信息就轉移到redis資料庫了,當應用重啟後數據仍然可以通過cookie中的sessionid獲取到,做到數據持久化,提高應用的健壯性。當然你可以嘗試存到其它資料庫裡面,選擇redis在於它極高的性能。
結語不管是express-cookie、express-session、connect-redis 都只是node的中間件,使用都非常簡單,關鍵點在於理解其中的原理,在不同場景都能很好的應用。
推薦閱讀: