一、Redis 基础
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
如果你不清楚当前存了什么 key ,可以使用 keys * 来查询所有 key
keys *

 如果你有多个 key ,用上面的语句可以将所有 key 都列出来。
删除
删除使用 del 。
del key
 
 
我把刚刚创建的 name 这条数据给删掉了。
此时使用 get 或者 keys * 都差不回 name 这条数据了。
以上就是 Redis 的基础用法。
二、NodeJS 操作 Redis
初始化项目
我用默认模板初始化项目。
npm init -y
安装 Redis 依赖
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()
与Express搭配使用
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
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/276789.html
