MySql和Redis的区别和使用场景
首先MySql是基于硬盘的数据库,而Redis是基于内存的数据库,硬件上的差异天然的造就出了他们具有不同的特点和使用场景
- 硬盘的硬件成本低,而内存的硬件成本高。因此MySql更适合应用于体积较大数据的存储。
- 内存的访问速度快,而硬盘的访问速度慢,所以相较于基于硬盘存储的MySql,Redis性能更高,更适合应用于需要高频次大量IO的场景。
- 相较于基于内存存储的Redis,MySql更容易进行断电恢复和数据找回,而Redis的相关操作所需要的成本则相对较高。
- 记录结构的不同:MySql是标准的关系型数据库,数据记录基于行(rows)列(columns)存储,而redis是key-value数据库。记录格式相对松散。
因此Redis更适合处理类似于登录和session的相关存储和操作
使用NodeJS连接MySql
- 使用NPM安装mysql库
npm install --save mysql
- 连接mysql
const mysql = require('mysql')
// 编辑配置,创建MySql连接
const connection = mysql.createConnection({
host: 'localhost', // 主机名
user: 'root', // mysql服务用户名
password: 'admin', // mysql用户密码
port: 3306, // mysql服务的端口号
database: 'myblog' // 要连接的数据库名称
})
// 开始连接
connection.connect()
// 执行查询语句
const sql = `select * from users;`
// 使用回调函数处理查询结果
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')
// 创建redis客户端
const redisClient = redis.createClient(6379, '127.0.0.1')
redisClient.on('error', err => {
console.error(err)
return
})
// 测试——设置redis记录
redisClient.set('myname', 'Frank', redis.print)
// 测试——查询redis记录
redisClient.get('myname', (err, val) => {
if (err) {
console.error(err)
return
}
console.log(val)
// 退出
redisClient.quit()
})
在NodeJS项目中集成MySql和Redis
- 创建配置文件
config/db.js
const env = process.env.NODE_ENV // 环境变量
// 配置
let MYSQL_CONF
let REDIS_CONF
// 为开发环境添加配置
if (env === 'dev') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'admin',
port: '3306',
database: 'myblog'
}
REDIS_CONF = {
host: '127.0.0.1',
port: 6379
}
}
// 根据需要,为生产环境添加配置
if (env === 'prod') {
MYSQL_CONF = {},
REDIS_CONF = {}
}
module.exports = {
MYSQL_CONF,
REDIS_CONF
}
- 创建
db/mysql.js
,将MySql集成到项目中。
const mysql = require('mysql')
const { MYSQL_CONF } = require('../config/db')
// 创建连接对象
const connection = mysql.createConnection(MYSQL_CONF)
// 开始连接
connection.connect()
// 统一执行 sql 的函数
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
}
- 创建
db/redis.js
,将redis集成到项目中。
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
}