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 ...
随机推荐
- 第一章 Spring 概述
Spring框架的生态,已经成了JavaWeb开发的事实标准 以IOC与AOP为基础,提供了一整套JavaWeb的开发解决方案 在需要引入功能前,先看看有没有Spring的实现,或者其他框架,看看能否 ...
- 三节点搭建openstack-Mitaka版本
前言: 现在的云计算平台已经非常火,也非常的稳定了.像阿里云平台,百度云平台等等,今天咱们基于openstack来搭建一个云平台 注意: 本次平台搭建为三节点搭建(没有外部存储节点,所有存储为本地存储 ...
- [BZOJ5120] [2017国家集训队测试]无限之环
Description 曾经有一款流行的游戏,叫做InfinityLoop,先来简单的介绍一下这个游戏: 游戏在一个n×m的网格状棋盘上进行,其中有些小方格中会有水管,水管可能在方格某些方向的边界的中 ...
- 【BZOJ4031】小Z的房间(矩阵树定理)
[BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子 ...
- BZOJ4755: [JSOI2016]扭动的回文串——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ...
- BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...
- BZOJ3994:[SDOI2015]约数个数和——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3994 https://www.luogu.org/problemnew/show/P3327#sub ...
- ZOJ3496:Assignment——题解
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496 题目大意:A公司从S到T运货,每条路都有一个运货上限,而B公司则有p ...
- SpringMVC源码解析-DispatcherServlet启动流程和初始化
在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...
- VS 2013 with update安装失败(kb2829760)解决方案
update过程中遇到kb2829760补丁无法更新而导致vs安装失败的解决方法: 1.安装KB2829760: 2.安装KB2829760中文语言包: 3.安装VS2013 with update. ...