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 }

 

posted @ 2018-07-23 17:49  白菜帮子  阅读(938)  评论(0编辑  收藏  举报