koajs mysql_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

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值