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 ...
随机推荐
- HDU 3879 Base Station(最大权闭合子图)
将第i个用户和他需要的基站连边,转化成求二分图的最大权闭合子图. 答案=正权点之和-最小割. # include <cstdio> # include <cstring> # ...
- Python虚拟环境virtualenv的使用
virtualenv 是一个创建孤立的Python环境的工具.可以让你创建各自独立的.互不影响的Python开发环境. 使用pip安装即可 pip install virtualenv 查看是否安装成 ...
- C++中Set的使用
/* #include <string> // 使用 string 类时须包含这个文件 #include <iostream> // 这个就加上去吧.c++的输入和输出. us ...
- 【刷题】洛谷 P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...
- POJ2195:Going Home——题解
http://poj.org/problem?id=2195 题目大意: 有些人和房子,一个人只能进一个房子,人走到房子的路程即为代价. 求所有人走到房子后的最小代价. ——————————————— ...
- [AHOI2008] 逆序对
link 我们可以很容易的推断出$-1$是单调不降的,若$i>j$且$a_i$与$a_j$都没有填数,若填完之后$a_i>a_j$或者$a_i<a_j$,则对答案产生影响的只在$[i ...
- PostgreSQL主键索引膨胀的重建方法
普通的索引膨胀处理比较简单,主键的索引膨胀也不复杂,只是在新旧索引交替时有一些小处理.本试验在primary key上通过CONCURRENTLY建立第二索引来解决索引膨胀问题,适用9.3.9.4,其 ...
- 000 Python常识与快捷键(未完)
1.Python控制台IDLE的快捷键 Alt + N :返回开始输入的第一条语句 Alt + P :返回刚刚输入的上一条语句 Tab:制表符,用于缩进或补全内容,是Python语法格式的灵魂,作用涵 ...
- HRBUST 1819
石子合并问题--圆形版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(27 users) Total Accepted: 26( ...
- sun.security.x509.CertAndKeyGen;找不到
导入已有项目编译时出错,报: import sun.security.x509.CertAndKeyGen;找不到 而这个包属于sun公司的jar包.不是项目本身的问题,而是开发环境的问题. 最后原因 ...