NodeJS訪問(wèn)和操作MySql和Redis數(shù)據(jù)庫(kù)

MySql和Redis的區(qū)別和使用場(chǎng)景

首先MySql是基于硬盤的數(shù)據(jù)庫(kù),而Redis是基于內(nèi)存的數(shù)據(jù)庫(kù),硬件上的差異天然的造就出了他們具有不同的特點(diǎn)和使用場(chǎng)景

  1. 硬盤的硬件成本低,而內(nèi)存的硬件成本高。因此MySql更適合應(yīng)用于體積較大數(shù)據(jù)的存儲(chǔ)。
  2. 內(nèi)存的訪問(wèn)速度快,而硬盤的訪問(wèn)速度慢,所以相較于基于硬盤存儲(chǔ)的MySql,Redis性能更高,更適合應(yīng)用于需要高頻次大量IO的場(chǎng)景。
  3. 相較于基于內(nèi)存存儲(chǔ)的Redis,MySql更容易進(jìn)行斷電恢復(fù)和數(shù)據(jù)找回,而Redis的相關(guān)操作所需要的成本則相對(duì)較高。
  4. 記錄結(jié)構(gòu)的不同:MySql是標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)記錄基于行(rows)列(columns)存儲(chǔ),而redis是key-value數(shù)據(jù)庫(kù)。記錄格式相對(duì)松散。

因此Redis更適合處理類似于登錄和session的相關(guān)存儲(chǔ)和操作

使用NodeJS連接MySql

  1. 使用NPM安裝mysql庫(kù)
    npm install --save mysql
  2. 連接mysql
const mysql = require('mysql')

// 編輯配置,創(chuàng)建MySql連接
const connection = mysql.createConnection({
  host: 'localhost',  // 主機(jī)名
  user: 'root', // mysql服務(wù)用戶名
  password: 'admin',  // mysql用戶密碼
  port: 3306, // mysql服務(wù)的端口號(hào)
  database: 'myblog'  // 要連接的數(shù)據(jù)庫(kù)名稱
})

// 開(kāi)始連接
connection.connect()

// 執(zhí)行查詢語(yǔ)句
const sql = `select * from users;`
// 使用回調(diào)函數(shù)處理查詢結(jié)果
connection.query(sql, (err, result) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(result)
})

connection.end()

使用NodeJS連接Redis

  1. 使用NPM安裝redis庫(kù)
    npm install --save redis
  2. 連接redis
const redis = require('redis')

// 創(chuàng)建redis客戶端
const redisClient = redis.createClient(6379, '127.0.0.1')
redisClient.on('error', err => {
  console.error(err)
  return
})

// 測(cè)試——設(shè)置redis記錄
redisClient.set('myname', 'Frank', redis.print)
// 測(cè)試——查詢r(jià)edis記錄
redisClient.get('myname', (err, val) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(val)

  // 退出
  redisClient.quit()
})

在NodeJS項(xiàng)目中集成MySql和Redis

  1. 創(chuàng)建配置文件config/db.js
const env = process.env.NODE_ENV  // 環(huán)境變量

// 配置
let MYSQL_CONF
let REDIS_CONF

// 為開(kāi)發(fā)環(huán)境添加配置
if (env === 'dev') {
  MYSQL_CONF = {
    host: 'localhost',
    user: 'root',
    password: 'admin',
    port: '3306',
    database: 'myblog'
  }
  REDIS_CONF = {
    host: '127.0.0.1',
    port: 6379
  }
} 

// 根據(jù)需要,為生產(chǎn)環(huán)境添加配置
if (env === 'prod') {
  MYSQL_CONF = {},
  REDIS_CONF = {}
}

module.exports = {
  MYSQL_CONF,
  REDIS_CONF
}
  1. 創(chuàng)建db/mysql.js,將MySql集成到項(xiàng)目中。
const mysql = require('mysql')
const { MYSQL_CONF } = require('../config/db')

// 創(chuàng)建連接對(duì)象
const connection = mysql.createConnection(MYSQL_CONF)

// 開(kāi)始連接
connection.connect()

// 統(tǒng)一執(zhí)行 sql 的函數(shù)
function exec(sql) {
  const promise = new Promise((resolve, reject) => {
    connection.query(sql, (err, result) => {
      if (err) {
        reject(err)
        return
      }
      resolve(result)
    })
  })

  return promise  
}

module.exports = {
  exec
}
  1. 創(chuàng)建db/redis.js,將redis集成到項(xiàng)目中。
const {REDIS_CONF} = require('../config/db')
const redis = require('redis')

const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host)
redisClient.on('error', err => {
  console.error(err)
  return
})

function set(key, val) {
  if (typeof val === 'object') {
    val = JSON.stringify(val)
  }
  redisClient.set(key, val)
}

function get(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 (error) {
        resolve(val)
      }
    })
  })
  return promise
}

module.exports = {
  get,
  set
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容