在作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 })