node 之 redis 使用

1,495 阅读3分钟

在项目开发中,为了做分布式,于是开始使用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并不难~

今天又是美好的一天~