学习如何使用Redis

84 阅读6分钟

开始使用Redis

Redis是一个开源的数据库,经常被用来构建高性能的可扩展网络应用。它使用内存数据库,这使得它比其他数据库更快。

Redis用于我们的应用程序中的短期数据。它经常被用于会话或网页头数。

通过使用内存数据库,我们不需要有大的数据集,相反,我们使用小的数据块,让我们把数据存储在机器的内存中,而不是磁盘的内存中。

Redis是一个键值存储,类似于我们在JavaScript中处理对象的方式。有几种语言和框架使用Redis;包括Python,以及Node.js等后端JavaScript框架。

在本教程中,我们将使用Redis和Node.js来调节会话。

先决条件

为了理解本课,你应该熟悉以下内容。

  • JavaScript。
  • 使用Node.js创建服务器以及它们的依赖关系。
  • 数据库。

目标

在本教程结束时,你应该能够。

  • 理解什么是Redis。
  • 理解Redis的基本原理。
  • 理解 Redis 的优势。
  • 安装Redis。
  • 安装Redis-CLI。
  • 理解数据类型--字符串、列表、集合、分类集合、哈希值。
  • 用Redis调节会话(Nodejs)。

Redis的优点

  • Redis数据库是快速的,因为它使用内存数据库。
  • 它在存储数据方面非常灵活。
  • 不需要模式和列名。
  • Redis支持丰富的数据类型,如列表和集合。
  • 它也被用于缓存系统和数据库,可以将数据持久化到磁盘上。

何时使用 Redis 缓存

使用Redis来缓存那些不经常变化的数据。

开始使用Redis

现在,让我们安装Redis。

在大多数情况下,我们会在一台服务器或其他机器上运行我们的数据库。

Redis的安装

打开你的终端,运行下面的命令。

wget https://download.redis.io/releases/redis-6.2.6.tar.gz

要在你的电脑上安装Redis。

tar xzf redis-6.2.6.tar.gz

打开下载的文件。

cd redis-6.2.6

改变目录。

make

执行称为Makefile的东西。

src/redis-server

这是为了运行服务器。

src/redis-cli

打开另一个终端,在那里我们运行CLI。

Redis CLI

Redis-CLI是Redis的命令行接口。它授权转发命令到Redis数据库,也可以通过终端读取从服务器发送的回复。

这些是一些 Redis-CLI 命令。

  • SET - 设置一个键的值。
SET name "John Snow"
ok

GET name
"100"
  • GET - 获取键的值。如果键不存在,将返回 。nil
redis 127.0.0.1:6379> GET nonexisting
(nil)
redis 127.0.0.1:6379> SET key "secret"
"OK"
redis 127.0.0.1:6379> GET mykey
"secret"
redis 127.0.0.1:6379>
  • ECHO - 回音给定的字符串。
redis 127.0.0.1:6379> ECHO "Welcome to redis"
redis 127.0.0.1:6379> "Welcome to redis"
redis 127.0.0.1:6379>
  • PING - 测试连接是否是活的。它将以 。PONG
redis 127.0.0.1:6379> PING
PONG
  • QUIT - 关闭连接。

数据类型

哈希

散列是一个字段-值对的集合。思考它们的最好方式是,它们类似于javascript中的对象。

redis> HMSET user id 45 name "John"
redis>

上面,我创建了一个带有key user的哈希值,这个key的id是45 ,名字是John

列表

列表是用链接列表实现的,而不是用数组。

如果你有非常长的列表,并且你需要快速添加元素到该列表中,那么列表就很有用。我们可以通过使用LPUSHRPUSH 来添加到列表中。LPUSH 意味着从左边推到当前头。而RPUSH 将会把它推到最后。

redis 127.0.0.1:6379> LPUSH people "John"
(integer) 1
redis 127.0.0.1:6379> LPUSH people "Zanza"
(integer) 2
redis 127.0.0.1:6379>> LPUSH people "Walker"
(integer) 3
redis 127.0.0.1:6379> LRANGE people 0 3
1) "Walker"
2) "Zanza"
3) "John"

LRANGE 命令是用来输出列表的。

字符串

Redis中的字符串是二进制安全的比特排序。它们就像我们在其他编程语言中使用的任何其他字符串一样。

redis 127.0.0.1:6379> SET name "Peter"
OK
redis 127.0.0.1:6379>> GET name
"Peter"

上面的例子中SETGET 是Redis的命令,name 是键,而Peter 是存储的值。

集合

Redis集合是一个没有特征的字符串的集合。

通过集合,可以删除、添加和测试一个组中是否存在重复的成员。

redis 127.0.0.1:6379> SADD countries "England"
(integer) 1
redis 127.0.0.1:6379> SADD countries "Poland"
(integer) 1
redis 127.0.0.1:6379> SADD countries "Egypt"
(integer) 1
redis 127.0.0.1:6379> SADD countries "Egypt"
(integer) 0
redis 127.0.0.1:6379> SMEMBER countries

1) "Egypt"
2) "Poland"
3) "England"

SADD 添加指定的成员到存储键的集合中。

SMEMBER 返回为一个键存储的集合值的所有成员。

排序集

Redis的排序集就像集合一样,只是排序集的每个成员都与一个分数相关联,允许它从最小到最大排序。

redis 127.0.0.1:6379> ZADD names 0 Paul
(integer) 1
redis 127.0.0.1:6379> ZADD names 0 Greenwood
(integer) 1
redis 127.0.0.1:6379> ZADD names 0 Angel
(integer) 1
redis 127.0.0.1:6379> ZADD names 0 Angel
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE names 0 1000

1) "Paul"
2) "Greenwood"
3) "Angel"

还有很多其他的命令,你可以学习Redis。

Redis 缓存(Node.js)

正如我们之前看到的,Redis是一个缓存管理系统。

如果有少量的数据,我们每次都要从服务器上获取,就会花费太多的时间。如果数据不是动态的,那么我们就可以将其缓存起来,并在请求时返回同样的数据。

现在,我们将建立一个服务器,向API请求将数据存储到Redis的本地应用系统中。然后,我们在需要时从Redis获取数据。

打开你选择的任何代码编辑器,在终端运行npm init -y ,创建一个package.json

npm init-y

然后,安装其他几个包,如下所示。

npm install express redis
npm install --save cross-fetch
npm install _D nodemon

API

我们将向这个API发出请求,生成一个全国所有大学的列表。

const express = require("express");
const redis = require("redis");
const fetch = require("cross-fetch");

// environment variables
const app = express();
const client = redis.createClient(6379);

function forwardData(country, website) {
  return `${country} =>> ${website}`;
}

// middleware to check if the country exist in redis database
function checkForCache(req, res, next) {
  const { country } = req.params;
  client.get(country, (err, website) => {
    if (err) throw err;
    if (website != null) res.send(forwardData(country, website));
    else next();
  });
}

// Dynamics url Path
app.get("/:country", checkForCache, async (req, res) => {
  try {
    const { country } = req.params;
    const resp = await fetch(
      `http://universities.hipolabs.com/search?country=${country}`
    );
    const data = await resp.json();
    const website = data[0].web_pages[0];
    client.setex(country, 3600, website[0]);
    res.send(forwardData(country, website));
  } catch (err) {
    console.log("Error:", err);
  }
});

Image 1

正如我们看到的,这是墨西哥所有大学的结果。在图片的底部,我们可以看到它花了8.71s 来进行API请求(这是很慢的)。

为了减少时间,我们将把这些数据存储到我们的Redis服务器中。因此,当用户发出请求时,它将检查数据是否已经存在。

如果它已经存在于数据库中,它将从那里获取数据。如果没有,它将请求链接。

Image 2

在将数据存储到我们的Redis服务器并再次对墨西哥进行API请求后,只花了850ms ,就加载了相同的数据。

我们可以看到从Redis数据库中获取数据的速度有多快。这使我们的应用程序运行得更快。

结语

最后,我们学习了什么是Redis,Redis的基本原理,Node.js中的Redis缓存,Redis的优势,如何安装Redis,Redis数据类型,以及Redis-CLI。

Redis改善了我们应用程序的响应时间,从而使它变得超级快。