一.在开发机安装redis并远程连接
因本人的远程开发机配置原因,使用jumbo安装redis
- 首先登录开发机,并使用jumbo 安装redis:jumbo install redis
- 查看redis各文件路径: jumbo list-files redis
- 确认redis-server 及 redis.conf的路径后启动redis: ~/.jumbo/bin/redis-server ~/.jumbo/etc/redis.conf (通过修改conf 文件中 daemonize 为 yes,可后台启动redis)
- 使用redis-cli 在控制台可进入redis: ~/.jumbo/bin/redis-cli
- 退出并关闭redis: ~/.jumbo/bin/redis-cli shutdown
- 配置redis的远程连接:还是修改conf文件,
将 bind 127.0.0.1 改为 bind 0.0.0.0
将protected-mode 改为 no
将requirepass 注释放开并设置密码 - 远程连接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 }