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來啟用
- var session = require(‘express-session‘);
- var RedisStore = require(‘connect-redis‘)(session);
- app.use(session({
- store: new RedisStore(options),
- secret: ‘keyboard cat‘
- }));
檢驗
- 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