MySql和Redis的區(qū)別和使用場(chǎng)景
首先MySql是基于硬盤的數(shù)據(jù)庫树枫,而Redis是基于內(nèi)存的數(shù)據(jù)庫部蛇,硬件上的差異天然的造就出了他們具有不同的特點(diǎn)和使用場(chǎng)景
- 硬盤的硬件成本低,而內(nèi)存的硬件成本高。因此MySql更適合應(yīng)用于體積較大數(shù)據(jù)的存儲(chǔ)。
- 內(nèi)存的訪問速度快扩然,而硬盤的訪問速度慢,所以相較于基于硬盤存儲(chǔ)的MySql聋伦,Redis性能更高夫偶,更適合應(yīng)用于需要高頻次大量IO的場(chǎng)景。
- 相較于基于內(nèi)存存儲(chǔ)的Redis觉增,MySql更容易進(jìn)行斷電恢復(fù)和數(shù)據(jù)找回兵拢,而Redis的相關(guān)操作所需要的成本則相對(duì)較高。
- 記錄結(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
- 使用NPM安裝mysql庫
npm install --save mysql
- 連接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
- 使用NPM安裝redis庫
npm install --save redis
- 連接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
- 創(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
}
- 創(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
}
- 創(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
}