在项目开发中,为了做分布式,于是开始使用redis,这里对redis的学习做一个总结。
背景
之前楼主在项目开发中,在node层使用session来记录用户的登录态,本地跑着完全没有问题,但是当项目进行分布式部署的时候,发现现实却不是想象的那么美好。
- 场景1:分布式情况下本地session会导致登录态错乱
- 场景2:多浏览器信息不同步
于是,在node层,我们接入了redis。
what
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。值的类型有以下几种:
- 字符串(String)
- 哈希(Map)
- 列表(list)
- 集合(sets)
- 有序集合(sorted sets)
安装
接着,我们来看下在node中怎么使用redis。
第一步,当然是先安装啦~
在本地开发的时候,我们可以在我们的电脑安装redis服务,开启之后可以使用node进行连接。
我这里用的是windows的机器,先到 redis 下载一个安装包,然后按照提示直接安装即可。
进入redis目录,打开cmd,然后执行以下命令,redis服务就跑起来了~
redis-server.exe redis.windows.conf
想试试服务有没有启动成功,可以使用redis的cli工具,我们可以直接操作redis~
tips:安装本地redis只是为了方便本地调试,一般情况下,项目中都会使用远端的redis,这样才能确保数据的统一性。
使用
安装完之后,接下来我们就要来看看怎么在node服务中使用redis。
session - redis
一般情况下,我们的项目都会做分布式,确保系统的可靠性。所以,像登录态这种信息就需要存到数据库中,一般会使用redis,也可以使用其他数据库~
这里使用的node框架是express,所以我们要先安装这几个依赖
npm install express
npm install express-session
npm install connect-redis
然后,项目初始化链接session的时候,直接配置即可。
let express = require('express');
let session = require('express-session');
let RedisStore = require('connect-redis')(session);
let app = express();
// 本地session
app.use(session({
secret: config.session.secret,
cookie: { maxAge: 2 * 60 * 60 * 1000 }
}));
// redis session
app.use(session({
name: 'binnie.sid',
store: new RedisStore({
host: host,
port: port,
pass: pass,
db: db,
ttl: 7200
}),
secret: secret,
resave: false,
saveUninitialized: true
}));
直连redis
大部分情况下,session即可解决分布式问题。当然也有解决不了的问题,比如用户切换浏览器的时候,session其实就会改变。
栗子:我的网站,一个用户同时只能观看一个视频,使用session的情况下,如果该用户换个浏览器,那么,我就识别不出来了。而使用redis,按照用户id来进行区分,那么我们就可以对用户进行限制!
let redis = require('redis');
let client = redis.createClient({
host: host,
port: port,
password: pass
});
client.auth(config.redis.pass, function() {
logger.info('redis auth ok');
});
client.on('connect', function() {
logger.info('redis connect ok');
});
client.on('ready', function() {
logger.info('redis ready ok');
});
// 读取redis
client.get(key, function(err, reply) {})
// 设置redis
client.set(key, value, redis.print);
写在最后
做前端的时候可能会比较少接触redis,接触node服务到后续分布式其实就会用到的,对前端同学来说学会使用redis并不难~
今天又是美好的一天~