【架構師(第四十一篇)】 服務端開發之安裝並連線 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