• nodejs 使用redis 管理session


    一.在开发机安装redis并远程连接

     因本人的远程开发机配置原因,使用jumbo安装redis

      1. 首先登录开发机,并使用jumbo 安装redis:jumbo install redis
      2. 查看redis各文件路径: jumbo list-files redis
      3. 确认redis-server 及 redis.conf的路径后启动redis:  ~/.jumbo/bin/redis-server ~/.jumbo/etc/redis.conf  (通过修改conf 文件中 daemonize 为 yes,可后台启动redis)
      4. 使用redis-cli 在控制台可进入redis: ~/.jumbo/bin/redis-cli
      5. 退出并关闭redis:  ~/.jumbo/bin/redis-cli shutdown
      6. 配置redis的远程连接:还是修改conf文件,
            将 bind 127.0.0.1 改为 bind 0.0.0.0 
            将protected-mode 改为 no
            将requirepass 注释放开并设置密码
      7. 远程连接redis: 本机安装redis完毕后,使用 redis-cli -h xxx.xxx.xxx.xx(远程ip)  -p 80xx(远程端口) -a xxxxx(远程密码)   进入远程redis数据库

    二、ioredis

    通过使用ioredis,可以方便的进行node对redis进行操作,包说明如下:https://www.npmjs.com/package/ioredis

    通过其封装的管道操作pipeline 实现redis的事务操作

    ioredis使用如下所示:

     1 export default {
     2     port:8079,
     3     host:'xxxxx',
     4     family:4,
     5     password:'123456',
     6     retryStrategy(times){
     7         return Math.min(times*50,2000);
     8     },
     9     reconnectOnError(err){
    10         if(err.message.slice(0,8) == 'READONLY'){
    11             return true;
    12         }
    13     }
    14 }
    15  
    16 const redis = new Redis(conf);

    其中redis对象即可以进行redis数据库中的所有操作,如 set get hmset hgetall 等等,参数的传入形式及顺序与redis-cli命令行中的一致。

    三、koa2中session的管理

    koa2中session管理有方便的node包,koa-session 、koa-session2等等,通过配置koa-session/koa-session2 中的store属性,即可将redis和session对象关联到一起。

     1 /**
     2 * 配置store对象的get set destroy属性即可操作session对象
     3 * 通过简单读取session.xxx 即可触发get方法,session={...} 即可触发set方法  session = null 或重置 session即可触发destroy方法
     4 * koa-session 与 koa-session2区别在于 koa-session2支持 async/await同步操作
     5 * koa-session2 需要extends Store才能使用
     6 */
     7 // koa-session配置如下
     8  
     9 export default {
    10     async get(key, maxAge, { rolling }){
    11         // console.log('get',key,maxAge,rolling);
    12         let res = await redis.hgetall(key).then(r=>r).catch(e=>{
    13             {error:e}
    14         });
    15         return res;
    16         console.log('get',res);
    17     },
    18     async set(key, sess, maxAge, { rolling, changed }){
    19         console.log('set',key,sess,maxAge,rolling,changed);
    20         if(changed){
    21             let seconds = Math.floor(maxAge/1000);
    22             redis.hmset(key,sess);
    23             redis.expire(key,seconds);
    24         }
    25     },
    26     async destroy(key){
    27         console.log('destory',key);
    28         await redis.del(key);
    29     }
    30 }
    31  
    32 //koa-session2
    33  
    34 class RedisStore extends Store {
    35     constructor(){
    36         super();
    37     }
    38     async get(key,ctx){
    39         // console.log('get',key,maxAge,rolling);
    40         let res = await redis.hgetall(key).then(r=>r).catch(e=>{
    41             {error:e}
    42         });
    43         return res;
    44     }
    45     async set(session, { sid =  this.getID(24), maxAge = 1000000 } = {}, ctx){
    46         console.log('set',session.openid,maxAge,sid);
    47         let seconds = Math.floor(maxAge/1000);
    48         await redis.hmset(sid,session);
    49         await redis.expire(sid,seconds);
    50         return sid;
    51     }
    52     async destroy(key,ctx){
    53         console.log('destory',key);
    54         await redis.del(key);
    55     }
    56 }
    57 let store = new RedisStore();
    58 export default store;

    在koa应用中作为中间件引入的方式如下

    1 let sessConf = Object.assign({},CONF,{store});
    2 app.use(session(sessConf)); // koa-session2
    3  
    4 app.use(session(sessConf,app)) // koa-session

    四、redis中session的expire时间顺延

    当用户在站内不断操作的时候,session需要一直维持,不能过期。待用户停止操作时,则在设定的相应时间后使存储在redis中的session过期,使用户重新登录。

    1 let {cookies} = ctx;
    2 let key = cookies.get('kris_sess'); // 保存session key 的cookie
    3 if(key && ctx.session.openid){
    4     cookies.set('kris_sess',key,{
    5         maxAge:60*1000
    6     }); // 对cookie进行延期
    7     redis.expire(key,60*1000); // 对redis session存储进行延期
    8     .....
    9 }

  • 相关阅读:
    每日学习心得:找不到类型{0},它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素...中提供,cellspacing、rowspacing属性
    我所理解的设计模式(C++实现)——解释器模式(Interpreter Pattern)
    uva-112 Tree Summing
    带你走进EJB--它都有哪些Bean
    Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
    Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
    《郭大侠的妹妹不可能那么可爱》 第一章 郭大侠那可爱的妹妹?
    Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
    Codeforces Round #356 (Div. 2) C. Bear and Prime 100 水题
    Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/9355993.html
Copyright © 2020-2023  润新知