node 之 redis 使用

寫不好程式碼的格子襯衫發表於2019-01-21

在專案開發中,為了做分散式,於是開始使用redis,這裡對redis的學習做一個總結。

背景

之前樓主在專案開發中,在node層使用session來記錄使用者的登入態,本地跑著完全沒有問題,但是當專案進行分散式部署的時候,發現現實卻不是想象的那麼美好。

  • 場景1:分散式情況下本地session會導致登入態錯亂
  • 場景2:多瀏覽器資訊不同步

於是,在node層,我們接入了redis。

what

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value儲存系統。值的型別有以下幾種:

  • 字串(String)
  • 雜湊(Map)
  • 列表(list)
  • 集合(sets)
  • 有序集合(sorted sets)

安裝

接著,我們來看下在node中怎麼使用redis。

第一步,當然是先安裝啦~

在本地開發的時候,我們可以在我們的電腦安裝redis服務,開啟之後可以使用node進行連線。

我這裡用的是windows的機器,先到 redis 下載一個安裝包,然後按照提示直接安裝即可。

進入redis目錄,開啟cmd,然後執行以下命令,redis服務就跑起來了~

redis-server.exe redis.windows.conf
複製程式碼

node 之 redis 使用

node 之 redis 使用

想試試服務有沒有啟動成功,可以使用redis的cli工具,我們可以直接操作redis~

node 之 redis 使用

tips:安裝本地redis只是為了方便本地除錯,一般情況下,專案中都會使用遠端的redis,這樣才能確保資料的統一性。

使用

安裝完之後,接下來我們就要來看看怎麼在node服務中使用redis。

session - redis

一般情況下,我們的專案都會做分散式,確保系統的可靠性。所以,像登入態這種資訊就需要存到資料庫中,一般會使用redis,也可以使用其他資料庫~

這裡使用的node框架是express,所以我們要先安裝這幾個依賴

npm install express
npm install express-session
npm install connect-redis
複製程式碼

然後,專案初始化連結session的時候,直接配置即可。

let express = require('express');
let session = require('express-session');
let RedisStore = require('connect-redis')(session);

let app = express();

// 本地session
app.use(session({
    secret: config.session.secret,
    cookie: { maxAge: 2 * 60 * 60 * 1000 }
}));

// redis session
app.use(session({
    name: 'binnie.sid',
    store: new RedisStore({
        host: host,
        port: port,
        pass: pass,
        db: db,
        ttl: 7200
    }),
    secret: secret,
    resave: false,
    saveUninitialized: true
}));
複製程式碼

直連redis

大部分情況下,session即可解決分散式問題。當然也有解決不了的問題,比如使用者切換瀏覽器的時候,session其實就會改變。

栗子:我的網站,一個使用者同時只能觀看一個視訊,使用session的情況下,如果該使用者換個瀏覽器,那麼,我就識別不出來了。而使用redis,按照使用者id來進行區分,那麼我們就可以對使用者進行限制!

let redis = require('redis');

let client = redis.createClient({
  host: host,
  port: port,
  password: pass
});

client.auth(config.redis.pass, function() {
  logger.info('redis auth ok');
});

client.on('connect', function() {
  logger.info('redis connect ok');
});

client.on('ready', function() {
  logger.info('redis ready ok');
});

// 讀取redis
client.get(key, function(err, reply) {})

// 設定redis
client.set(key, value, redis.print);
複製程式碼

寫在最後

做前端的時候可能會比較少接觸redis,接觸node服務到後續分散式其實就會用到的,對前端同學來說學會使用redis並不難~

今天又是美好的一天~

相關文章