在作nodejs服務的負載時要考慮到session共享的問題,通常經常使用的就是memcached方式實現的,本文主要介紹經過npm社區的幾個模塊輕鬆實現這個功能。
作koa的session通常會想到用koa-session,可是這裏並不合適,koa-session只是用內存的方式去實現,這裏要用到的是koa-generic-session。
koa-generic-session跟koa-session同樣能夠用內存的方式(基本方式)實現,但它能夠擴展的是其餘的方式,好比redis mysql mongo等,因此選擇這個模塊是第一步。
koa-generic-session確實強大,可是根據官方的介紹卻沒有跟memcached結合的方式,卻是memcached這個模塊是存在的,其中也找到了一個koa-session-memcached的模塊,可是依賴的不是memcached模塊,擴展性沒有那麼好。
不過koa-generic-session裏面說到了node
You can use any other store to replace the default MemoryStore, it just needs to follow this api: mysql
意思是說能夠用其餘的存儲方式替換默認的內存存儲方式,這個方式只須要包含get set destroy方法便可,可是這些方法返回的是promise thunk 或者generator(這些都是koa裏面用到的返回方式,方便yield使用)。另外還有就是經過connect disconnect兩個事件監聽存儲方式的狀態。
那麼能夠這樣git
'use strict'; /** * @description koa session memcached * @author subying */ const Memcached = require('memcached'); var EventEmitter = require('events'); class storeMemcached extends EventEmitter{ constructor(serverLocations, options){ super(); var memcached = new Memcached(serverLocations, options); this.client = memcached; memcached.on('error', this.emit.bind(this, 'disconnect')); memcached.on('end', this.emit.bind(this, 'disconnect')); memcached.on('connect', this.emit.bind(this, 'connect')); } /* *@description 獲取 *@param key {String} */ get(key){ var memcached = this.client; return new Promise(function(resolve, reject) { memcached.get(key, function (err, data) { if(!err){ resolve(data); }else{ reject(err); } }); }); } /* *@description 設置 *@param key {String} *@param value *@param expires {Number} 過時時間設置 單位爲毫秒 由於koa-generic-session 默認的是毫秒,默認值是86400000(24小時) */ set(key,value,expires){ var memcached = this.client; return new Promise(function(resolve, reject) { // expires要轉換成秒 由於memcached設置用的是秒 memcached.set(key,value,expires/1000,function (err, data) { if(!err){ resolve(data); }else{ reject(err); } }); }); } /* *@description 刪除 *@param key {String} */ destroy(key){ var memcached = this.client; return new Promise(function(resolve, reject) { memcached.delete(key,function (err, data) { if(!err){ resolve(data); }else{ reject(err); } }); }); } } module.exports = storeMemcached;
這個項目放在了 https://github.com/subying/koa-store-memcached.git,並提交到了npm社區,名字爲 koa-store-memcached(原本想用koa-session-memcached,可是這個名字被佔用了)。
安裝後這樣使用就能夠了github
var app = require('koa')(); const session = require('koa-generic-session'); const MemcachedStore = require('koa-store-memcached'); app.use(session{ store:new MemcachedStore(Server locations, options) //配置參考 memcached })