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

koajs项目之memcached实现session共享的更多相关文章

  1. Nginx + Memcached 实现Session共享的负载均衡

    session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Se ...

  2. 【Tomcat】Tomcat + Memcached 实现session共享

    概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解 ...

  3. 分布式Session共享(二):tomcat+memcached实现session共享

    一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...

  4. Tomcat通过Memcached实现session共享的完整部署记录

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  5. 项目分布式部署那些事(2):基于OCS(Memcached)的Session共享方案

    在不久之前发布了一篇"项目分布式部署那些事(1):ONS消息队列.基于Redis的Session共享,开源共享",因为一些问题我们使用了阿里云的OCS,下面就来简单的介绍和分享下相 ...

  6. java项目使用memcache实现session共享+session基础

    本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略. 基础篇: 1.了解java web中的session ...

  7. 企业级memcached部署(session共享)

    服务端部署 第一个里程碑:安装依赖关系 Memcache用到了libevent这个库用于Socket的处理. [root@nfs01 ~]# yum install libevent libevent ...

  8. NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享

    原文地址: http://my.oschina.net/u/1791256/blog/283064 TOMCAT7.0+ NGINX + MEMCACHED + memcached-session-m ...

  9. Nginx+Tomcat+Memcached实现session共享

    实验环境: server1:nginx tomcat memcached server2:tomcat memcached Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入 ...

随机推荐

  1. 面试题-lazyMan实现

    原文:如何实现一个LazyMan 面试题目 实现一个LazyMan,可以按照以下方式调用: LazyMan('Hank'),输出: Hi, This is Hank! LazyMan('Hank'). ...

  2. lnmp平台搭设

    软件链接:https://pan.baidu.com/s/14gAZ67iXWhEdzvEXMiGfVg             提取码:ai1s 只是在一台服务器上搭设,为centos7.2环境 安 ...

  3. Go语言学习笔记(1)——Hello World!

    第一个go程序——HelloWorld.go 源码 : package main import ("fmt") // import "fmt" func mai ...

  4. 从C#到TypeScript - 类型

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  5. Delphi:程序自己删除自己,适用于任何windows版本(含源码)

    Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var   sei: TSHELLEXECUTEINFO;   szMod ...

  6. React 安装

    1.安装 node  8.0以上 node -v npm -v 2.安装淘宝镜像 cnpm npm install -g cnpm --registry=https://registry.npm.ta ...

  7. 深入理解Spring的ImportSelector接口

    ImportSelector接口是至spring中导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)都有它的存在,关于SpringBoot的分析可以参考:深 ...

  8. CentOS 部署 Python3 的一些注意事项

    环境:centos6.7https://github.com/vinta/awesome-pythonhttps://github.com/PyMySQL/PyMySQLhttps://github. ...

  9. 每一行代码都有记录—如何用git一步步探索项目的历史

    每一行代码都有一块被隐藏了的文档信息. 下面的代码片段不管是谁写的,其第4行因为某些原因要访问一个DOM结点的clientLeft属性,但却对结果不作任何处理.这十分的莫名其妙,你能告诉我他们为什么要 ...

  10. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...