zoukankan      html  css  js  c++  java
  • Node + Redis 实现分布式Session方案(转载)

     

    Session是什么?

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

    Session 怎么工作?

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

    在服务端存储 Session,可以有很多种方案:

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

    分布式Session

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

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

    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 是怎么得到的,稍候会有详细的代码示例。

    Hashing Ring

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

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

    我的哈希环实现( 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/)

  • 相关阅读:
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    从ramdisk根文件系统启动Linux成功
    linux中的设备名称和设备号
    设备与驱动的关系以及设备号、设备文件
    使用BusyBox制作Linux根文件系统
    使用Busybox-1.2.0制作根文件系统
    使用BusyBox制作根文件系统
    使用busybox制作rootfs
    uboot里读sd卡内容
  • 原文地址:https://www.cnblogs.com/zhurunlai/p/9431457.html
Copyright © 2011-2022 走看看