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

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

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

  1. 硬盤的硬件成本低,而內(nèi)存的硬件成本高。因此MySql更適合應(yīng)用于體積較大數(shù)據(jù)的存儲(chǔ)。
  2. 內(nèi)存的訪問速度快扩然,而硬盤的訪問速度慢,所以相較于基于硬盤存儲(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ù)庫逾礁,數(shù)據(jù)記錄基于行(rows)列(columns)存儲(chǔ)说铃,而redis是key-value數(shù)據(jù)庫。記錄格式相對(duì)松散嘹履。

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

使用NodeJS連接MySql

  1. 使用NPM安裝mysql庫
    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ù)庫名稱
})

// 開始連接
connection.connect()

// 執(zhí)行查詢語句
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庫
    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

// 為開發(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)

// 開始連接
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)系作者
  • 序言:七十年代末蚓峦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子济锄,更是在濱河造成了極大的恐慌,老刑警劉巖霍转,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荐绝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡避消,警方通過查閱死者的電腦和手機(jī)低滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門召夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恕沫,你說我怎么就攤上這事监憎。” “怎么了婶溯?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鲸阔,是天一觀的道長。 經(jīng)常有香客問我迄委,道長褐筛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任叙身,我火速辦了婚禮渔扎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘信轿。我一直安慰自己晃痴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布财忽。 她就那樣靜靜地躺著愧旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪定罢。 梳的紋絲不亂的頭發(fā)上笤虫,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音祖凫,去河邊找鬼琼蚯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惠况,可吹牛的內(nèi)容都是我干的遭庶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼稠屠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼峦睡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起权埠,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤榨了,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后攘蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龙屉,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年满俗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了转捕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作岖。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖五芝,靈堂內(nèi)的尸體忽然破棺而出痘儡,到底是詐尸還是另有隱情,我是刑警寧澤枢步,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布沉删,位于F島的核電站,受9級(jí)特大地震影響价捧,放射性物質(zhì)發(fā)生泄漏丑念。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一结蟋、第九天 我趴在偏房一處隱蔽的房頂上張望脯倚。 院中可真熱鬧,春花似錦嵌屎、人聲如沸推正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽植榕。三九已至,卻和暖如春尼夺,著一層夾襖步出監(jiān)牢的瞬間尊残,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工淤堵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寝衫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓拐邪,卻偏偏與公主長得像慰毅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扎阶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容