开始使用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 。
列表
列表是用链接列表实现的,而不是用数组。
如果你有非常长的列表,并且你需要快速添加元素到该列表中,那么列表就很有用。我们可以通过使用LPUSH 或RPUSH 来添加到列表中。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"
上面的例子中SET 和GET 是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);
}
});

正如我们看到的,这是墨西哥所有大学的结果。在图片的底部,我们可以看到它花了8.71s 来进行API请求(这是很慢的)。
为了减少时间,我们将把这些数据存储到我们的Redis服务器中。因此,当用户发出请求时,它将检查数据是否已经存在。
如果它已经存在于数据库中,它将从那里获取数据。如果没有,它将请求链接。

在将数据存储到我们的Redis服务器并再次对墨西哥进行API请求后,只花了850ms ,就加载了相同的数据。
我们可以看到从Redis数据库中获取数据的速度有多快。这使我们的应用程序运行得更快。
结语
最后,我们学习了什么是Redis,Redis的基本原理,Node.js中的Redis缓存,Redis的优势,如何安装Redis,Redis数据类型,以及Redis-CLI。
Redis改善了我们应用程序的响应时间,从而使它变得超级快。