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里面说到了

You can use any other store to replace the default MemoryStore, it just needs to follow this api:     

  • 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两个事件监听存储方式的状态。
  那么可以这样

'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,但是这个名字被占用了)。
  安装后这样使用就可以了

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 
})
原文地址:https://www.cnblogs.com/subying/p/5709470.html