在NodeJS中使用Redis緩存數據


Redis數據庫采用極簡的設計思想,最新版的源碼包還不到2Mb。其在使用上也有別於一般的數據庫。

node_redis

redis驅動程序多使用 node_redis 此模塊可搭載官方的 hiredis C 語言庫 - 同樣是非阻塞的,比使用JavaScript內置的解釋器性能稍好。可選擇將hiredis 與 redis 一同安裝。

 

  • npm install hiredis redis

 

如果 hiredis 安裝成功, node_redis 會默認使用 hiredis, 否則會使用JavaScript的解釋器。

 

Redis的一個Key不僅可以對應一個String類型的值,還支持hashes, lists, sets, sorted sets, bitmaps等。

 

比如存/取一組Hash值,Redis中有兩個對應的命令

 

HMSET key field value [field value ...]、 為一個Key一次設置多個哈希鍵/值, 多用於JSON對象的寫入(序列化的SESSION)。

 

HGETALL key 讀取一個Key的所有 哈希鍵/值,多用於JSON對象讀取

 

這兩個命令即是在NodeJS中存取JSON對象的關鍵,

下面是node_reids中對應的例子:

  • var redis = require("redis"),
  •     client = redis.createClient();
  •  
  • //寫入JavaScript(JSON)對象
  • client.hmset(‘sessionid‘, { username: ‘kris‘, password: ‘password‘ }, function(err) {
  •   console.log(err)
  • })
  •  
  • //讀取JavaScript(JSON)對象
  • client.hgetall(‘sessionid‘, function(err, object) {
  •   console.log(object)
  • })

 

Redis沒有嚴格意義上的表名和字段名,以 Key-Value 鍵值對的方式存儲,因此一般采用 schema:key 形式做為鍵值,其中

 

schema: 可理解為傳統數據庫中的表名 key:    可理解為表中的主鍵

 

因此使用redis存放你的session時,需要一個schema前輟, 比如這個key: sessionid:i4w3axuzyj4nwwg75y6k5us2

 

Redis 也僅能對Key進行檢索, 尚不支持對Key所存放的Hash Key的檢索。 如要檢索到所有session,只需匹配 sessionid:* 即可。

 

  • client.keys(‘session:*‘, function (err, keys) {
  •   console.log(keys)
  • })

 

有些第三方庫會支持檢索值中的Hash Key,但這不是一個原子性操作,redis本身並不提供。

 

因此在采用Redis緩存與檢索數據時,要使用一些獨特的數據類型,如集合(Sets)

 

  • > sadd myset 1 2 3    //添加 1 2 3到集合myset
  • (integer) 3
  • > smembers myset      //列出集合的所有成員
  • 1. 3
  • 2. 1
  • 3. 2
  • > sismember myset 30  //判斷30是否存在
  • (integer) 0           //不存在

Redis集合不允許添加相同成員。多次添加同一元素到集合中最終只會包含一個元素。多個集合之間可以進行連接/交集這樣的操作。從而實現類似傳統數據庫中索引、條件和連接查詢的效果。

 

  • # 添加 3 個用戶和信息
  • hmset user:1 user_name lee age 21
  • hmset user:2 user_name david age 25
  • hmset user:3 user_name chris age 25
  •  
  • # 維護age索引
  • sadd age:21 1
  • sadd age:25 2 3
  •  
  • # 維護name索引
  • sadd name:lee 1
  • sadd name:david 2
  • sadd name:chris 3
  •  
  • # 查找  age = 25 和 name = lee 的用戶
  • sinter age:25 name:lee
  •   -> 會返回一個空集合

 

將Session存放到Redis中

 

connect-reids  是一個 Redis 版的 session 存儲器,使用node_redis作為驅動。借助它即可在Express中啟用Redis來持久化你的Session.

 

安裝

  • $ npm install connect-redis

在 Express 3.x 中還需要安裝express-session

 

  • $ npm install express-session

 

參數

 

client 你可以復用現有的redis客戶端對象, 由 redis.createClient() 創建 host Redis服務器名 port Redis服務器端口 socket Redis服務器的unix_socket

 

可選參數

 

ttl Redis session TTL 過期時間 (秒) disableTTL 禁用設置的 TTL db 使用第幾個數據庫 pass Redis數據庫的密碼 prefix 數據表前輟即schema, 默認為 “sess:”

 

使用

將express-session傳給connect-redis來啟用

  1. var session = require(‘express-session‘);
  2. var RedisStore = require(‘connect-redis‘)(session);
  3.  
  4. app.use(session({
  5.     store: new RedisStore(options),
  6.     secret: ‘keyboard cat‘
  7. }));

檢驗

 

  • app.use(function (req, res, next) {
  •   if (!req.session) {
  •     return next(new Error(‘oh no‘)) // handle error
  •   }
  •   next() // otherwise continue
  • })

 

這樣你的Session就轉移到了Redis數據庫,這樣做的一個額外好處是,當你的Express服務器突然重啟后,用戶仍然可以使用當前Cookie中的SessionID從數據庫中獲取到他的會話狀態,做到會話不丟失,在一定程度上提高網站的鍵壯性。

 

如果你的NodeJS網站上的所有緩存數據都轉移到了Redis后,就可做到完全狀態無關,按需擴展網站的規模。

可水平擴展的NodeJS網站服務器集群(非 cluster模塊 
不同,它們是相互獨立的,可分布在不同的物理服務器上),這樣的架構,對於應對超大規模並發也是有好處的。

 轉自https://www.cnblogs.com/BlueKevin/p/5457788.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM