OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

在OnceIO(Node.JS)中用Redis储存Session


分享到
分类 JS学习   关键字 Node.JS   发布 ourjs  1483692256951
注意 转载须保留原文链接,译文链接,作者译者等信息。  

单线程的 Node.js 为了充分利用 CPU 的多核特性,采用了 cluster 模块,利用主从模式,生成与 CPU 核心数量相当的子进程,主进程捕获请求随机分配给子进程处理,并负责子进程的崩溃重启。进程与进程之间是不能共享数据的,如果把 Session 存储在内存里,存储在不同进程的内存中的 Session 将无法共享,Session 认证机制会出现问题。例如,用户 A 认证的过程是由进程 1 处理的,那么维持会话的 Session 将保存在进程 1 的内存数据中;用户 A 接下来的请求被分配给进程 2 处理,因为进程 2 没有处理过用户 A 的认证,没有维持这个会话的 Session,所以进程 2 会判断用户 A 并没有授权。这样用户 A 需要多次重复认证访问才能继续下去。

为了解决这个问题,OnceIO 使用了 Redis 数据库来存储 Session,不同进程可以通过访问同一数据库实现 Session 的共享。

流程说明

  1. 客户端向服务器发起请求,主进程将这一请求随机分配给某一子进程处理,如处理过程中产生 Session,客户端将 SessionID 保存在 Cookie 中,于此同时子进程将 Session 缓存到 Redis 中;
  2. 客户端向服务器发起一个包含 SessionID 的请求,主进程将这一请求随机分配给某一子进程处理,子进程把这一 SessionID 对应的 Session 从 Redis 中检索出来使用。

 

使用接口

OnceIO 使用 app.sessionStore 来指定将 session 存储到何处。Session 的 Redis 存储是使用 redisstore.js 来实现。其中 client 是一个 redis 实例,第二个参数是 session 过期时间,单位为豪秒

var redisstore    = OnceStore(client, 1000 * 1000)
app.sessionStore  = redisstore

您也可以依照 redisstore.js 写法将 session 存放到 mongodb或 mysql中,只需要实现:get/set/del 三个接口即可。

 

具体实现

将 Session 储存在 Redis 里的具体实现与 Lesson 12 中将 Session 储存在服务器内存中的具体实现非常相似,创建、修改和删除 Session 的接口都没有发生改变,启动 Session 和设置获取 Session 的步骤完全相同。

将 Session 储存在 Redis 里的最大的两个的不同一是服务器会用到 redis 这一 node 模块和 onceio 文件夹中的 redisstore.js 文件,因此在服务器文件开头除了 onceio.js 之外还需要 require 这两个文件(require 前请确保已经在服务器文件所在目录用 npm 安装好了 redis);二是需要在服务器文件中创建一个 Redis 的 client 并设置用这个 client 储存 Session。

以下代码演示了如何用 Redis 储存 Session,并实现了用 Session 记录用户访问的上个网页的功能,用户每访问一个网页,req.session 对象的 lastpage 属性就会被更新,当服务器需要得知用户上一次访问的网页时,就能读取 Session 中记录的内容,得到相应信息:

var onceio    = require('../onceio/onceio')
var OnceStore = require('../onceio/redisstore')
var redis     = require('redis')

var ONCEIO_CONFIG = { sessionTimeout : 1000 * 1000 } 
// a Session can remain idle for 1000 seconds before the server terminates it automatically

var app = onceio(ONCEIO_CONFIG)

var client = redis.createClient()

client.on('ready', function() {
  var redisstore    = OnceStore(client, ONCEIO_CONFIG.sessionTimeout / 1000)
  app.sessionStore  = redisstore
})

app.use('/', function(req, res){
    req.filter.next()
}, { session: true })

app.get('/a', function(req, res){
    if(req.session.lastPage) {
        console.log('Last page was: ' + req.session.lastPage + '.')   
    } 

    req.session.lastPage = '/a' //Update session.lastPage everytime the webpage is visited
    res.send('Welcome to a!')
})

app.get('/b', function(req, res){
    if (req.session.lastPage) {
        console.log('Last page was: ' + req.session.lastPage + '.')    
    }

    req.session.lastPage = '/b'  
    res.send('Welcome to b!')
})

app.get('/c', function(req, res){
    if (req.session.lastPage){
        console.log("Last page was: " + req.session.lastPage + '.')    
    }

    req.session.lastPage = '/c'
    res.send('Welcome to c!')
})

例如,用户访问 ‘/a' 网页后,Redis 中的 Session 显示为:

Redis  Session

如果 Session 在 sessionTimeout 这一段时间内都没有活动,Redis 中储存的 Session 会被自动删除。

 

OnceIO地址: https://github.com/OnceDoc/onceio

Git示例源码: https://github.com/OnceDoc/OnceAcademy/tree/master/Lesson15

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NodeJS教程:基于OnceIO框架实现文件上传和验证
  2. 2016年前端技术观察
  3. 在Debian上安装Nginx并搭建一个最简单的静态网站服务器(以OnceAI为例)
  4. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  5. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制
  6. OnceIO(Node.JS)的网页(模板)的引用与嵌套
  7. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  8. 如何搭建个人SASS云盘:30秒快速安装OnceDoc企业私有网盘
  9. OnceIO模块开发:模块注册、模块路由、静态文件重定向以及如何开发与设计一个功能扩展模块
  10. OnceIO的模块拦截与注入:模板文件路由重定向与Model数据改写
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. OnceIO的模块拦截与注入:模板文件路由重定向与Model数据改写
  2. OnceIO模块开发:模块注册、模块路由、静态文件重定向以及如何开发与设计一个功能扩展模块
  3. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  4. NodeJS教程:基于OnceIO框架实现文件上传和验证
  5. 在Debian(Raspberry Pi)树莓派上安装NodeJS
  6. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  7. OnceIO(Node.JS)的网页(模板)的引用与嵌套
  8. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制
  9. NodeJS中的客户端缓存、浏览器缓存、304缓存和OnceIO的缓存控制
  10. OnceIO(Node.JS)的路由(Routing)、路由方法和路由变量

 关键字 - Node.JS
  1. node.js使用unzip解压zip包指定文件,提取 word/excel (docx/pptx/xlsx) 文本内容
  2. Node.JSv8的5个新特性:支持string padding与async/await和object参数省略
  3. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  4. node.js中fs.stat里的atime,mtime,ctime,birthtime在debian下的更新规则与区别
  5. NodeJS的DNS使用:域名解析,MX记录查询,SPF反垃圾邮件测试
  6. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  7. 是什么让Node.js比Java更快?为什么NodeJS这么快?
  8. 用纯Node.JS弹出Windows系统消息提示框(MessageBox)
  9. 利用Windows注册表将你的Node.JS程序添加到右健菜单直接运行
  10. Node.js中的通用基础设计模式

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号