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 ...
随机推荐
- web服务器压测工具siege、ab
web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...
- Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现
最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下;先说 ...
- 洛谷 P2024 [NOI2001]食物链 解题报告
P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...
- python3.5安装pycrypto
在python中使用AES加密是一种有效的加密方式,如果你研究过微信公众号api就会发现,它也用的是这个加密的.在写代码的时候,要安装crypto模块,在linux或者mac上都好说,但是在windo ...
- H5背景音乐自动播放(兼容微信IOS,进程后台切换自动停止播放,本文例子为Vue写法)
<template> <audio src="./static/music.mp3" id="bgMusic" preload="a ...
- Android网络请求的时候报错 Connection refused 处理
在用Android测试JSON数据解析的时候,报了这样一个异常: java.net.ConnectException: localhost/ - Connection refused 原来模拟器默认把 ...
- [转载]系统管理:update-alternatives
http://blog.csdn.net/dbigbear/article/details/4398961 好吧,其实博主也是转载的. update-alternatives --display | ...
- jq 正则
if(_each_this_type_name == 'post_num'){ var patrn = /^[a-zA-Z0-9]{3,12}$/; if(!patrn.test(_each_this ...
- MFC中用正则表达式进行有效性验证
转载自:http://blog.csdn.net/jinhill/article/details/5928993 正则表达式最实用的一个地方是验证用户输入.它可以轻松验证邮编.电话号码.信用卡号码-- ...
- [LeetCode] Binary Tree Level Order Traversal 与 Binary Tree Zigzag Level Order Traversal,两种按层次遍历树的方式,分别两个队列,两个栈实现
Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of its nodes ...