一、Redis 基础

Redis 可以说是最最最简单的数据库了。大部分数据库的读写操作都是在硬盘上的,而 Redis 是在内存上的。所以读写速度会比其他传统数据库要快。但缺点是数据不能持久化,一旦断电重启,数据就没了。当然,Redis 也是可以将数据持久化的,但我觉得这样做的成本有点高,如果要将数据持久化不如直接用传统数据库。

Redis 可能用得最多的地方就是存储 session ,用来记录用户登录状态之类的操作。这类数据就算丢失了也不会对用户有多大影响。

要使用 Redis ,首先就要安装它。windows版下载链接放在这里:

 

 

 我下载了 .msi 格式的安装包,下载后直接双击运行,一直点 “下一步” 就能安装成功。

在安装时记得勾选将 Redis 添加到全局环境。

安装成功后,打开终端,输入一下命令

  1. redis-cli

 

 

 进入交互模式就证明安装成功了,此时可以输入指令操作 Redis 了。

127.0.0.1 是本机 IP6379 是 Redis 默认的端口号。

写入数据使用 set 指令

  1. set key value

key 是键名,value 是值。

我设置了一个 name ,值为 zhangsan

输入完按回车键,返回 OK 证明写入成功。 

读取数据使用 get 。

  1. get key

key 是键名。

 

如果查到就返回值。

如果你不清楚当前存了什么 key ,可以使用 keys * 来查询所有 key

  1. keys *

 

 

 如果你有多个 key ,用上面的语句可以将所有 key 都列出来。

删除使用 del 。

  1. del key

 

我把刚刚创建的 name 这条数据给删掉了。

此时使用 get 或者 keys * 都差不回 name 这条数据了。

 

以上就是 Redis 的基础用法。

二、NodeJS 操作 Redis

我用默认模板初始化项目。

  1. npm init -y
  1. npm install redis

如果你想用旧版语法,可以安装指定版本。

比如 2.8 版

  1. npm install redis@2.8

安装好 Redis 后就可以用 NodeJS 来连接了。

新建一个 js 文件。

v2.8语法

  1. const redis = require('redis') // 引入 redis
  2. // 创建客户端
  3. const redisClient = redis.createClient('6379', '127.0.0.1') // 端口,主机
  4. // 监听错误信息
  5. redisClient.on('error', err => {
  6. console.error(err) // 打印监听到的错误信息
  7. })

v4.2 语法

  1. const redis = require('redis') // 引入 redis
  2.  
  3. const redisClient = redis.createClient() // 创建客户端
  4. // 监听错误信息
  5. redisClient.on('err', err => {
  6. console.log('redis client error: ', err)
  7. })
  8. // 连接
  9. redisClient.connect(6379, '127.0.0.1')

写入数据使用 set 方法

v2.8

  1. redisClient.set('name', 'zhangsan', redis.print)

第三个参数 redis.print 是打印方法,在执行完上面的命令,控制台会打印一条信息。

比如执行成功,会打印 Reply: OK

v4.2

  1. const redis = require('redis') // 引入 redis
  2. // 创建客户端
  3. const redisClient = redis.createClient()
  4. // 监听错误信息
  5. redisClient.on('err', err => {
  6. console.log('redis client error: ', err)
  7. })
  8. // 创建连接,是个 promise
  9. redisClient.connect(6379, '127.0.0.1')
  10. .then(() => {
  11. redisClient.set('name', 'zhangsan')
  12. .then(val => {
  13. console.log(val)
  14. })
  15. })

上面的代码意思是,使用 client.connect 连接,成功后再执行 set 操作。

你也可以将上面的代码改成 async 和 await 语法。

使用 get 方法可以读取数据

v2.8

  1. // 省略部分代码
  2. redisClient.get('name', (err, val) => {
  3. if (err) {
  4. console.error(err)
  5. return
  6. }
  7. console.log(val)
  8. })

v4.2

  1. const redis = require('redis') // 引入 redis
  2. // 创建客户端
  3. const redisClient = redis.createClient()
  4. // 创建连接,是个 promise
  5. redisClient.connect(6379, '127.0.0.1')
  6. .then(() => {
  7. redisClient.get('name')
  8. .then(val => {
  9. console.log(val)
  10. })
  11. })

如果查找到就返回对应的值,否则返回 null

使用 del 方法删除

v2.8

  1. // 省略部分代码
  2. redisClient.del('name', (err, val) => {
  3. if (err) {
  4. console.error(err)
  5. return
  6. }
  7. console.log(val)
  8. })

v4.2

  1. const redis = require('redis') // 引入 redis
  2. // 创建客户端
  3. const redisClient = redis.createClient()
  4. // 创建连接,是个 promise
  5. redisClient.connect(6379, '127.0.0.1')
  6. .then(() => {
  7. redisClient.del('name')
  8. .then(val => {
  9. console.log(val)
  10. })
  11. })

用完就断,用 quit 方法可以断开连接。

在断开连接这件事上,v2.8 和 v4.2 的语法相同

  1. redisClient.quit()

v2.8

  1. const express = require("express");
  2. const fetch = require("node-fetch");
  3. const redis = require("redis");
  4. const PORT = process.env.PORT || 5000;
  5. const REDiS_PORT = process.env.REDiS_PORT || 6379;
  6. const app = express();
  7. const client = redis.createClient(REDiS_PORT);
  8. // Cache middleware
  9. function cache(req, res, next) {
  10. const { username } = req.params;
  11. client.get(username, (err, data) => {
  12. if (err) throw err;
  13. if (data !== null) {
  14. // 缓存中有数据,返回缓存中的数据
  15. res.send(setResponse(username, data));
  16. } else {
  17. // 否则继续之前的请求
  18. next();
  19. }
  20. });
  21. }
  22. // 设置响应
  23. function setResponse(username, repos) {
  24. return `<h2>${username} has ${repos} Github repositories</h2>`;
  25. }
  26. // 获取github仓库数量
  27. async function getRepos(req, res, next) {
  28. try {
  29. console.log("Fetching Data...");
  30. const { username } = req.params;
  31. const response = await fetch(`https://api.github.com/users/${username}`);
  32. const data = await response.json();
  33. const repos = data.public_repos;
  34. // 存到redis
  35. // 三个参数分别是键、有效期、值
  36. client.setex(username, 3600, repos);
  37. res.send(setResponse(username, repos));
  38. } catch (error) {
  39. console.error(error);
  40. res.status = 500;
  41. }
  42. }
  43. // 使用中间件,加上第二个参数cache
  44. app.get("/repos/:username", cache, getRepos);
  45. app.listen(5000, () => {
  46. console.log(`App listening on port ${PORT}`);
  47. });

v4.2

  1. const express = require("express");
  2. const fetch = require("node-fetch");
  3. const redis = require("redis");
  4. const PORT = process.env.PORT || 5000;
  5. const REDiS_PORT = process.env.REDiS_PORT || 6379;
  6. const app = express();
  7. const client = redis.createClient();
  8. client.connect(REDiS_PORT).then(() => {
  9. // 使用中间件,加上第二个参数cache
  10. app.get("/repos/:username", cache, getRepos);
  11. app.listen(5000, () => {
  12. console.log(`App listening on port ${PORT}`);
  13. });
  14. })
  15. // Cache middleware
  16. function cache(req, res, next) {
  17. const { username } = req.params;
  18. client.get(username).then(data => {
  19. console.log('data', data);
  20. if (data !== null) {
  21. // 缓存中有数据,返回缓存中的数据
  22. res.send(setResponse(username, data));
  23. } else {
  24. // 否则继续之前的请求
  25. next();
  26. }
  27. });
  28. }
  29. // 设置响应
  30. function setResponse(username, repos) {
  31. return `<h2>${username} has ${repos} Github repositories</h2>`;
  32. }
  33. // 获取github仓库数量
  34. async function getRepos(req, res, next) {
  35. try {
  36. console.log("Fetching Data...");
  37. const { username } = req.params;
  38. const response = await fetch(`https://api.github.com/users/${username}`);
  39. const data = await response.json();
  40. const repos = data.public_repos;
  41. // 存到redis
  42. // 三个参数分别是键、有效期、值
  43. client.setex(username, 3600, repos);
  44. res.send(setResponse(username, repos));
  45. } catch (error) {
  46. console.error(error);
  47. res.status = 500;
  48. }
  49. }

 参照:https://zhuanlan.zhihu.com/p/537632389

https://juejin.cn/post/7084061592660213790

集群:https://blog.51cto.com/u_15067247/4024249

版权声明:本文为vickylinj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/vickylinj/p/16515297.html