redis在nodejs,express,koa2中注册和使用

582 阅读2分钟

redis在nodejs中的使用:

  1. 安装redis插件
  2. 创建redisClient实例,监听error事件
const redis = require("redis");
const { REDIS_CONF } = require("../config/db");

const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host);
redisClient.on("error", (err) => {
  console.log(err);
});

  1. 实现往redis存值得方法 set,往redis 取值的方法 get
function set(key, val) {
  if (typeof val === "object") {
    val = JSON.stringify(val);
  }
  redisClient.set(key, val, redis.print);
}


function get(key) {
  return new Promise((resolve, reject) => {
  // redisClient.get 是异步的,外面包一层promise
    redisClient.get(key, (err, val) => {
      if (err) {
        reject(err);
        return;
      }
      // redis中没找到key对应的value
      if (val === null) {
        resolve(null);
        return;
      }
      // 兼容json格式
      try {
        resolve(JSON.parse(val));
      } catch (error) {
        resolve(val);
      }
    });
  });
}

redis在express中的使用

  1. 安装 redis 插件;创建 redisClien ; 监听error事件 【和nodejs中的处理相同】
  2. 安装 express-session 和 connect-redis
  3. 创建 RedisStore类
const session = require('express-session')
const RedisStore = require('connect-redis')(session)
  1. 创建sessionStore,将session存到redis中,注册到Express中
const redisClient = require('./db/redis')
const sessionStore = new RedisStore({
  client: redisClient
})

// 解析完cookie后,去解析session
app.use(session({
  secret: 'Csieke123_Ex#sde34',
  cookie: {
    path: '/', // 每一个子路由都能访问cookie
    httpOnly: true,  // 前端js没办法访问cookie,只有后端能访问
    // 上面两个都是默认配置
    maxAge: 24 * 60 * 60 * 1000, // 24h后失效
  },
  store: sessionStore
}))
  1. 需要将属性存到redis中时,直接往req.session对象加属性即可 ; 取的时候,也是直接在req.session上取
// 存username 和 realname
req.session.username = data.username; 
req.session.realname = data.realname;

// 取username 
author = req.session.username

redis在koa2中的连接和使用:

  1. 安装redis, koa-generic-session,koa-redis
  2. 注册session,将session存在redis里
const session = require('koa-generic-session') 
const redisStore = require('koa-redis') 

// 一定在注册之前写
// session 配置
// 这个keys自己定义
app.keys = ['Csi32#_34']  
app.use(session({
  // 配置 cookie
  cookie: {
    path: '/',
    httpOnly: true,
    maxAge: 24 * 60 * 60 * 1000
  },
  // 配置redis
  store: redisStore({
    all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
  })
}))
  1. 需要将属性存到redis中时,直接给ctx.session加此属性; 需要从redis取属性时,直接从ctx.session里取出这个属性即可
// 存到redis
ctx.session.username = data.username
ctx.session.realname = data.realname

// 从redis里取出
author = ctx.session.username