Node + Redis 实现分布式Session方案(转载)

 

Session是什么?

Session 是面向链接的状态信息,是对 Http 无状态协议的补充。javascript

Session 怎么工做?

Session 数据保留在服务端,而为了标识具体 Session 信息指向哪一个链接,须要客户端传递向服务端发送一个链接标识,好比存在Cookies 中的session_id值(也能够经过URL的QueryString传递),服务端根据这个id 存取状态信息。html

在服务端存储 Session,能够有不少种方案:java

  1. 内存存储
  2. 数据库存储
  3. 分布式缓存存储

分布式Session

随着网站规模(访问量/复杂度/数据量)的扩容,针对单机的方案将成为性能的瓶颈,分布式应用在所不免。因此,有必要研究一下 Session 的分布式存储。node

如前述, Session使用的标识实际上是客户端传递的 session_id,在分布式方案中,通常会针对这个值进行哈希,以肯定其在 hashing ring 的存储位置。redis

Session_id

在 Session 处理的事务中,最重要的环节莫过于 客户端与服务端 关于 session 标识的传递过程:算法

  • 服务端查询客户端Cookies 中是否存在 session_id
    1. 有session_id,是否过时?过时了须要从新生成;没有过时则延长过时
    2. 没有 session_id,生成一个,并写入客户端的 Set-Cookie 的 Header,这样下一次客户端发起请求时,就会在 Request Header 的 Cookies带着这个session_id

好比我用 Express, 那么我但愿这个过程是自动完成的,不须要每次都去写 Response Header,那么我须要这么一个函数(摘自朴灵的《深刻浅出Node.js》):数据库

这个函数替换了writeHead,在每次Response写Header时它都会获得执行机会,因此它是自动化的。这个req.session.id 是怎么获得的,稍候会有详细的代码示例。json

Hashing Ring

hashing ring 就是一个分布式结点的回路(取值范围:0到232 -1,在零点重合):Session 应用场景中,它根据 session_id 的哈希值,按顺时针方向就近安排一个大于其值的结点进行存储。缓存

Hashing Ring
实现这个回路的算法多种多样,好比 一致性哈希cookie

个人哈希环实现( hashringUtils.js:

 

配置


配置信息是须要根据环境而变化的,某些状况下它又是不能公开的(好比Session_id 加密用的私钥),因此须要一个相似的配置文件( config.cfg:

在Node 中 序列化/反序列化JSON 是件使人愉悦的事,写个配置读取器也至关容易(configUtils.js:

 

分布式Redis 操做

有了上述的基础设施,实现一个分布式 Redis 分配器就变得至关容易了。为演示,这里只简单提供几个操做 Hashes 的方法(redisMatrix.js:

 

分布式Session操做

session_id 的事务和 分布式的Redis都有了,分布式的 Session 操做呼之欲出(sessionUtils.js:

结合 Express 应用

在 Express 中只须要简单的 use 就能够了( app.js:

这个被引用的 session 模块暴露了一些操做 session 的方法,在须要时能够这样使用:

 

原网址(http://www.moye.me/2014/09/28/%E5%88%86%E5%B8%83%E5%BC%8Fsession/)

相关文章
相关标签/搜索