標籤:

如何在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 cookie

1.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 的有效時長。

使用

3 redis

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的中間件,使用都非常簡單,關鍵點在於理解其中的原理,在不同場景都能很好的應用。


推薦閱讀:

數據多的時候為什麼要使用redis而不用mysql?

TAG:Redis | NoSQL |