Redis
可以说是最最最简单的数据库了。大部分数据库的读写操作都是在硬盘上的,而 Redis
是在内存上的。所以读写速度会比其他传统数据库要快。但缺点是数据不能持久化,一旦断电重启,数据就没了。当然,Redis
也是可以将数据持久化的,但我觉得这样做的成本有点高,如果要将数据持久化不如直接用传统数据库。
Redis
可能用得最多的地方就是存储 session
,用来记录用户登录状态之类的操作。这类数据就算丢失了也不会对用户有多大影响。
要使用 Redis
,首先就要安装它。windows版下载链接放在这里:https://github.com/tporadowski/
我下载了 .msi
格式的安装包,下载后直接双击运行,一直点 “下一步” 就能安装成功。
在安装时记得勾选将 Redis
添加到全局环境。
安装成功后,打开终端,输入一下命令
redis-cli
进入交互模式就证明安装成功了,此时可以输入指令操作 Redis
了。
127.0.0.1
是本机 IP
;6379
是 Redis
默认的端口号。
写入数据使用 set
指令
set key value
key
是键名,value
是值。
我设置了一个 name
,值为 zhangsan
。
输入完按回车键,返回 OK
证明写入成功。
读取数据使用 get
。
get key
key
是键名。
如果查到就返回值。
如果你不清楚当前存了什么 key
,可以使用 keys *
来查询所有 key
keys *
如果你有多个 key
,用上面的语句可以将所有 key
都列出来。
删除使用 del
。
del key
我把刚刚创建的 name
这条数据给删掉了。
此时使用 get
或者 keys *
都差不回 name
这条数据了。
以上就是 Redis
的基础用法。
我用默认模板初始化项目。
npm init -y
npm install redis
如果你想用旧版语法,可以安装指定版本。
比如 2.8
版
npm install redis@2.8
安装好 Redis
后就可以用 NodeJS
来连接了。
新建一个 js
文件。
v2.8语法
const redis = require('redis') // 引入 redis // 创建客户端 const redisClient = redis.createClient('6379', '127.0.0.1') // 端口,主机 // 监听错误信息 redisClient.on('error', err => { console.error(err) // 打印监听到的错误信息 })
v4.2 语法
const redis = require('redis') // 引入 redis const redisClient = redis.createClient() // 创建客户端 // 监听错误信息 redisClient.on('err', err => { console.log('redis client error: ', err) }) // 连接 redisClient.connect(6379, '127.0.0.1')
写入数据使用 set
方法
v2.8
redisClient.set('name', 'zhangsan', redis.print)
第三个参数 redis.print
是打印方法,在执行完上面的命令,控制台会打印一条信息。
比如执行成功,会打印 Reply: OK
v4.2
const redis = require('redis') // 引入 redis // 创建客户端 const redisClient = redis.createClient() // 监听错误信息 redisClient.on('err', err => { console.log('redis client error: ', err) }) // 创建连接,是个 promise redisClient.connect(6379, '127.0.0.1') .then(() => { redisClient.set('name', 'zhangsan') .then(val => { console.log(val) }) })
上面的代码意思是,使用 client.connect
连接,成功后再执行 set
操作。
你也可以将上面的代码改成 async
和 await
语法。
使用 get
方法可以读取数据
v2.8
// 省略部分代码 redisClient.get('name', (err, val) => { if (err) { console.error(err) return } console.log(val) })
v4.2
const redis = require('redis') // 引入 redis // 创建客户端 const redisClient = redis.createClient() // 创建连接,是个 promise redisClient.connect(6379, '127.0.0.1') .then(() => { redisClient.get('name') .then(val => { console.log(val) }) })
如果查找到就返回对应的值,否则返回 null
。
使用 del
方法删除
v2.8
// 省略部分代码 redisClient.del('name', (err, val) => { if (err) { console.error(err) return } console.log(val) })
v4.2
const redis = require('redis') // 引入 redis // 创建客户端 const redisClient = redis.createClient() // 创建连接,是个 promise redisClient.connect(6379, '127.0.0.1') .then(() => { redisClient.del('name') .then(val => { console.log(val) }) })
用完就断,用 quit
方法可以断开连接。
在断开连接这件事上,v2.8 和 v4.2 的语法相同
redisClient.quit()
v2.8
const express = require("express"); const fetch = require("node-fetch"); const redis = require("redis"); const PORT = process.env.PORT || 5000; const REDiS_PORT = process.env.REDiS_PORT || 6379; const app = express(); const client = redis.createClient(REDiS_PORT); // Cache middleware function cache(req, res, next) { const { username } = req.params; client.get(username, (err, data) => { if (err) throw err; if (data !== null) { // 缓存中有数据,返回缓存中的数据 res.send(setResponse(username, data)); } else { // 否则继续之前的请求 next(); } }); } // 设置响应 function setResponse(username, repos) { return `<h2>${username} has ${repos} Github repositories</h2>`; } // 获取github仓库数量 async function getRepos(req, res, next) { try { console.log("Fetching Data..."); const { username } = req.params; const response = await fetch(`https://api.github.com/users/${username}`); const data = await response.json(); const repos = data.public_repos; // 存到redis // 三个参数分别是键、有效期、值 client.setex(username, 3600, repos); res.send(setResponse(username, repos)); } catch (error) { console.error(error); res.status = 500; } } // 使用中间件,加上第二个参数cache app.get("/repos/:username", cache, getRepos); app.listen(5000, () => { console.log(`App listening on port ${PORT}`); });
v4.2
const express = require("express"); const fetch = require("node-fetch"); const redis = require("redis"); const PORT = process.env.PORT || 5000; const REDiS_PORT = process.env.REDiS_PORT || 6379; const app = express(); const client = redis.createClient(); client.connect(REDiS_PORT).then(() => { // 使用中间件,加上第二个参数cache app.get("/repos/:username", cache, getRepos); app.listen(5000, () => { console.log(`App listening on port ${PORT}`); }); }) // Cache middleware function cache(req, res, next) { const { username } = req.params; client.get(username).then(data => { console.log('data', data); if (data !== null) { // 缓存中有数据,返回缓存中的数据 res.send(setResponse(username, data)); } else { // 否则继续之前的请求 next(); } }); } // 设置响应 function setResponse(username, repos) { return `<h2>${username} has ${repos} Github repositories</h2>`; } // 获取github仓库数量 async function getRepos(req, res, next) { try { console.log("Fetching Data..."); const { username } = req.params; const response = await fetch(`https://api.github.com/users/${username}`); const data = await response.json(); const repos = data.public_repos; // 存到redis // 三个参数分别是键、有效期、值 client.setex(username, 3600, repos); res.send(setResponse(username, repos)); } catch (error) { console.error(error); res.status = 500; } }
参照:https://zhuanlan.zhihu.com/p/537632389
集群:https://blog.51cto.com/u_15067247/4024249