【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库

1,686 阅读2分钟

本地安装 Redis

下载

👉👉 下载地址

进入到下载地址,我下载的是这个

image.png

本地安装

我这里解压到 D 盘了,所有的文件就只有这些。

image.png

使用 vscode 打开这个文件

image.png

找到 requirepass foobared,复制到新的一行,将前面的 # 删除,并清除空格,不然会造成密码设置不成功。

然后将 foobared 改为自己需要的密码,然后保存,身份不够的以管理员身份打开。

image.png

redis 所在文件夹打开 cmd,执行 redis-server.exe  redis.windows.conf,这时界面显示 redis 信息,说明服务正常开启。

image.png

为了方便下次启动,在 redis 所在文件夹下新建 startup.bat 文件,内容为 redis-server.exe  redis.windows.conf

image.png

这个窗口不要关闭,继续打开一个 cmd,执行 redis-cli.exe -h 127.0.0.1 -p 6379 -a xiaowei123 回车

其中 xiaowei123 就是之前设置的密码。

然后使用 set key value 设置缓存,使用 get key 读取缓存,出现以下界面就证明本地安装成功了。

image.png

连接 Redis

项目中安装 Redis

这里为了跟着老师学习,指定安装版本,新版本语法不一样会导致错误。

npm i redis@3.0.2 -S

配置 Redis

// src\config\envs\dev.js

module.exports = {
  // redis 连接配置
  redisConf: {
    port: '6379',
    host: '127.0.0.1',
    password: 'xiaowei123'
  },
}

封装设置/获取缓存

// src\cache\index.js

const redisClient = require('../db/redis')

/**
 * redis set
 * @param {string} key key
 * @param {string|Object} val val
 * @param {number} timeout 过期时间,单位 s ,默认 1h
 */
function cacheSet(key, val, timeout = 60 * 60) {
  let formatVal
  if (typeof val === 'object') {
    formatVal = JSON.stringify(val)
  } else {
    formatVal = val
  }
  redisClient.set(key, formatVal)
  redisClient.expire(key, timeout)
}

/**
 * redis get
 * @param {string} key key
 */
function cacheGet(key) {
  const promise = new Promise((resolve, reject) => {
    redisClient.get(key, (err, val) => {
      if (err) {
        reject(err)
        return
      }
      if (val == null) {
        resolve(null)
        return
      }

      try {
        resolve(JSON.parse(val))
      } catch (ex) {
        resolve(val)
      }
    })
  })
  return promise
}

module.exports = {
  cacheSet,
  cacheGet,
}

测试连接 Redis 数据库

// src\db\redis.js

const redis = require('redis')
const { redisConf } = require('../config/index')

// 创建客户端
const { port, host, password } = redisConf
const opt = {}
if (password) {
  opt.password = password // prd 环境需要密码
}
const redisClient = redis.createClient(port, host, opt)
redisClient.on('error', err => {
  console.error('redis connect error', err)
})
// 运行 node src/db/redis.js 进行测试连接
redisClient.on('connect', () => {
  console.log('redis connect success')
  redisClient.set('foo', 'bar', redis.print) // => "Reply: OK"
  redisClient.get('foo', redis.print) // => "Reply: bar"
  redisClient.quit()
})

module.exports = redisClient

控制台执行 node src/db/redis.js,出现 success 说明连接成功了。

image.png

进一步测试数据库连接

// src\routes\index.js
const router = require('koa-router')()
const packageInfo = require('../../package.json')
const testMysqlConn = require('../db/mysql2')
const ENV = require('../utils/env')
const { WorkModel } = require('../models/WorksModel')
const { cacheGet, cacheSet } = require('../cache/index')

// 测试数据库连接
router.get('/api/db-check', async (ctx) => {
  // 测试 mysql 数据库连接
  const mysqlRes = await testMysqlConn()

  // 测试 mongodb 数据库连接
  let mongodbConn
  try {
    mongodbConn = true
    await WorkModel.findOne()
  } catch (error) {
    mongodbConn = false
  }

  // 测试 Redis 连接
  cacheSet('name', 'biz editor sever OK - by redis')
  const redisTestVal = await cacheGet('name')

  ctx.body = {
    errno: 0,
    data: {
      name: 'biz editor server',
      version: packageInfo.version,
      ENV,
      mysqlConn: mysqlRes.length > 0,
      mongodbConn,
      redisConn: redisTestVal != null,
    }
  }
})

module.exports = router

访问 http://localhost:3000/api/db-checkredisConn 的结果为 true,也进一步证明了 Redis 数据库连接成功了。

image.png