zoukankan      html  css  js  c++  java
  • 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 
    })
    
  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/subying/p/5709470.html
Copyright © 2011-2022 走看看