nodejs 使用redis 管理session
一.在开发机安装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使用如下所示:
export default {
port:8079,
host:'xxxxx',
family:4,
password:'123456',
retryStrategy(times){
return Math.min(times*50,2000);
},
reconnectOnError(err){
if(err.message.slice(0,8) == 'READONLY'){
return true;
}
}
}
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对象关联到一起。
/**
* 配置store对象的get set destroy属性即可操作session对象
* 通过简单读取session.xxx 即可触发get方法,session={...} 即可触发set方法 session = null 或重置 session即可触发destroy方法
* koa-session 与 koa-session2区别在于 koa-session2支持 async/await同步操作
* koa-session2 需要extends Store才能使用
*/
// koa-session配置如下 export default {
async get(key, maxAge, { rolling }){
// console.log('get',key,maxAge,rolling);
let res = await redis.hgetall(key).then(r=>r).catch(e=>{
{error:e}
});
return res;
console.log('get',res);
},
async set(key, sess, maxAge, { rolling, changed }){
console.log('set',key,sess,maxAge,rolling,changed);
if(changed){
let seconds = Math.floor(maxAge/1000);
redis.hmset(key,sess);
redis.expire(key,seconds);
}
},
async destroy(key){
console.log('destory',key);
await redis.del(key);
}
} //koa-session2 class RedisStore extends Store {
constructor(){
super();
}
async get(key,ctx){
// console.log('get',key,maxAge,rolling);
let res = await redis.hgetall(key).then(r=>r).catch(e=>{
{error:e}
});
return res;
}
async set(session, { sid = this.getID(24), maxAge = 1000000 } = {}, ctx){
console.log('set',session.openid,maxAge,sid);
let seconds = Math.floor(maxAge/1000);
await redis.hmset(sid,session);
await redis.expire(sid,seconds);
return sid;
}
async destroy(key,ctx){
console.log('destory',key);
await redis.del(key);
}
}
let store = new RedisStore();
export default store;
在koa应用中作为中间件引入的方式如下
let sessConf = Object.assign({},CONF,{store});
app.use(session(sessConf)); // koa-session2
app.use(session(sessConf,app)) // koa-session
四、redis中session的expire时间顺延
当用户在站内不断操作的时候,session需要一直维持,不能过期。待用户停止操作时,则在设定的相应时间后使存储在redis中的session过期,使用户重新登录。
let {cookies} = ctx;
let key = cookies.get('kris_sess'); // 保存session key 的cookie
if(key && ctx.session.openid){
cookies.set('kris_sess',key,{
maxAge:60*1000
}); // 对cookie进行延期
redis.expire(key,60*1000); // 对redis session存储进行延期
.....
}
nodejs 使用redis 管理session的更多相关文章
- nodejs express下使用redis管理session
Session实现原理 实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的Session ID结合浏览器的Cookie实现对Session的管理,一般来说包括以下4个步骤: 服务器 ...
- 用Redis管理Session
maven <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</ar ...
- Shiro经过Redis管理会话实现集群(转载)
原文:http://www.myexception.cn/software-architecture-design/1815507.html Shiro通过Redis管理会话实现集群 写在前面 1.在 ...
- 在nodejs使用Redis缓存和查询数据及Session持久化(Express)
在nodejs使用Redis缓存和查询数据及Session持久化(Express) https://segmentfault.com/a/1190000002488971
- Tomcat7基于Redis的Session共享实战二
目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无 ...
- 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session
什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...
- ASP.NET下跨应用共享Session和使用Redis进行Session托管简介
在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...
- 单点登录实现(spring session+redis完成session共享)
一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...
- 超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据.做为一名有10年以上JAVA开发经验的程序员,工作中项目也是广泛使用了Redi ...
随机推荐
- 【bzoj3932】[CQOI2015]任务查询系统 离散化+主席树
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...
- poj 1469 COURSES (二分匹配)
COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16877 Accepted: 6627 Descript ...
- Python程序性能分析模块----------cProfile
cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...
- Andorid API Package ---> android.accessibilityservice
包名: android.accessibilityservice Added in API level 4 URL:http://developer.andro ...
- 【刷题】HDU 4405 Aeroplane chess
Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled fr ...
- BZOJ2242 [SDOI2011]计算器 【BSGS】
2242: [SDOI2011]计算器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4741 Solved: 1796 [Submit][Sta ...
- vue中使用 contenteditable 制作输入框并使用v-model做双向绑定
<template> <div class="div-input" :class="value.length > 0 ? 'placeholder ...
- select和epoll概念
关于linux的I/O复用接口select和epoll,下列说法错误的是() select调用时会进行线性遍历,epoll采用回调函数机制,不需要线性遍历 select的最大连接数为FD_SETSIZ ...
- MySql 利用函数 查询所有子节点
前提:mysql 函数 find_in_set(str,strlist), cast(value as type) 一.find_in_set(str,strlist):如果字符串str是在的 ...
- http基础(1.了解web及网络基础,2.简单的http协议)
第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...