• 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 
    })
    
  • 相关阅读:
    第9章 垄断市场中的企业决策
    第8章 完全竞争市场中的企业决策
    第7章 生产产出的决策分析
    第6章 成本分析
    第5章 生产要素投入的决策分析
    C++_函数指针的内容和应用
    大数据的框架-流程梳理
    数字图像处理_基本概念
    C++_项目开发与Cmake构建工具
    终端--通信和传输协议
  • 原文地址:https://www.cnblogs.com/subying/p/5709470.html
Copyright © 2020-2023  润新知