node.js使用redis儲存session(詳細步驟)
轉儲session的原因
網上有許多session需要用資料庫儲存的原因,對我來說原因很簡單,僅僅只是node的生產環境不允許將session存到伺服器的記憶體中。會報一個記憶體溢位的風險警告。所以我決定將session轉儲到資料庫中。而用於儲存session的方案有許多,這裡由於本人比較菜,所以選擇了主流的redis來儲存我的session狀態
安裝redis
首先既然要使用redis,那麼第一步當然是將redis安裝到伺服器上,伺服器一般都是linux的作業系統。
所以下面是linux的安裝步驟
1.進入官網下載redis
2.將下載好的檔案通過xftp上傳到伺服器並進行安裝
這裡我將安裝包放到了/usr/local/src 的目錄下
然後通過xshell來對其進行解壓
cd /usr/local/src //進入存放redis的檔案 tar -xzvf redis-4.0.11.tar.gz //解壓檔案
解壓完成後進入解壓後的資料夾對其進行編譯
編譯完成後就可以對其進行配置
開啟配置檔案
vim redis.conf
為了讓其在後臺執行
需將其修改為守護程序模式
然後給redis設定密碼
修改完成按esc退出
:wq儲存
然後將redis設定為開機啟動
首先新建redis的開機啟動指令碼
vim /etc/init.d/redis
檔案內容如下
#!/bin/sh # chkconfig:2345 80 90 # description: Start and Stop redis #PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/src/redis-4.0.11/src/redis-server REDIS_CLI=/usr/local/src/redis-4.0.11/src/redis-cli PIDFILE=/var/run/redis_6379.pid CONF="/usr/local/src/redis-4.0.11/redis.conf" AUTH="lhy" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed"else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running"else PID=$(cat $PIDFILE) echo "Stopping ..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x ${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac
這裡的pidfile 在redis.conf配置檔案中有
如下圖
編輯完成後儲存退出
然後新增開機啟動服務
vim /etc/rc.local
進入檔案後在末尾新增
service redis start
儲存退出
然後設定許可權
chmod 755 /etc/init.d/redis
設定完成後註冊系統服務
chkconfig --add redis
然後測試一下redis能否啟動
進入redis資料夾後
輸入
service redis start
啟動成功後我們看一下redis是否配置成功
ps -ef|grep redis
沒有問題就可以建立軟連線了
ln -s /usr/local/src/redis-4.0.11/src/redis-cli /usr/bin/redis
測試redis
軟連線建立完直接在命令列輸入
redis即可
這裡要輸入你在配置檔案中設定的密碼
到這裡redis就安裝完成了
配置防火牆
在上面的配置完成後我們還不能正常使用
還需要對防火牆進行配置
我們先檢視一下埠的情況
netstat -lntp
我們可以看到6379已經被正確監聽了
在這裡由於我並不會對redis進行什麼操作
也不關心它儲存的資料,所以我不需要從外網對redis進行訪問,因為它只是暫存一下專案的session
所以我這裡就不開放防火牆上的埠了
如果需要開放的小夥伴
使用以下命令
firewall-cmd --zone=public --add-port=這裡是你想開啟的埠/tcp --permanent (--permanent永久生效,沒有此引數重啟後失效)
firewall-cmd --reload 重啟防火牆
在node中使用redis
redis已經安裝完成了
接下來就是在node中使用redis來暫存session了
首先在package.json中安裝
redis模組,connect-redis模組
"redis": "^2.8.0"
"connect-redis":"^3.3.3"
重新安裝一下依賴cnpm i這裡由於npm比較慢所以我用的cnpm然後就可以在程式碼中使用了先看一下原本沒用redis的程式碼我用express-session來儲存使用者狀態
有這一行程式碼
使用req.session就可以儲存使用者的一些資料
接下來把剛才的兩行程式碼
session = require('express-session');
app.use(session({secret:'lhy2018'}));
修改為如下程式碼
session = require('express-session'), redis = require('redis'), client = redis.createClient({password:"lhy"}),//這裡填寫redis的密碼 RedisStore = require('connect-redis')(session); client.on("error", function (err) { console.log("Error " + err);//用於提示錯誤資訊 }); let options = { client:client, port:6379,//埠號 host:"127.0.0.1"//主機 }; app.use(session( { store: new RedisStore(options), secret:"lhy2018"//以此字串加密 }));
這樣使用req.session就可以將你想儲存的會話資料存到redis中了
就可以避免記憶體溢位的風險了
然後用pm2重啟服務
到這裡就已經成功將session的值存到redis中了,完結*★,°*:.☆\( ̄▽ ̄)/$:*.°★*。撒花!