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

语言: CN / TW / HK

highlight: a11y-dark theme: smartblue


持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

本地安装 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

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

js npm i [email protected] -S

配置 Redis

```js // src\config\envs\dev.js

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

封装设置/获取缓存

```js // 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 数据库

```js // 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

进一步测试数据库连接

```js // 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