koajs項目之memcached實現session共享

在作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(sid): get session object by sid   
  • set(sid, sess, ttl): set session object for sid, with a ttl (in ms)
  • destroy(sid): destroy session for sid    
    the api needs to return a Promise, Thunk or generator.
    And use these events to report the store's status.
  • connect    
  • disconnect    

  意思是說能夠用其餘的存儲方式替換默認的內存存儲方式,這個方式只須要包含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 
})
相關文章
相關標籤/搜索