Redis 速成课程
Redis 是一种数据库,可以添加到生产级应用程序中以提升性能。我将介绍 Redis 的基础知识,并展示一个 Redis 的实际应用案例。
本文将探讨以下内容:
- Redis是什么?
- Redis为何如此火爆?
- 何时使用Redis?
- Redis 安装
- Redis 基本命令
- 列表
- 套
- 哈希
- 使用 Redis 让你的网站速度提升 30-40%
- 使用 Redis 作为主数据库
那么,让我们深入探讨一下。
Redis是什么?
Redis 是一个内存数据库,延迟低于毫秒级。Redis 的全称是远程字典服务( Remote Dictionary Service)。Redis 的强大之处在于它将数据存储在内存中,而不是速度较慢的磁盘上。数据库中的每个数据点都是一个键值对。值可以是以下任何字段:
- 字符串 - 你好,世界
- 位图 - 0011001
- 位域 - {325}{655}{678}
- 哈希表 - {a: "hello", b:'world}
- 列表 - [ A > B > C ]
- 集合 - { A, B, C}
- 已排序集合 - {A: 1, B: 2, C: 3}
- 地理空间 - {A:(52, 2, 3)}
- Hyperlog
- 溪流
Redis为何如此火爆?
Redis之所以如此受欢迎,是因为它速度极快。与数据存储在速度较慢的硬盘上的关系型数据库不同,Redis将数据存储在内存(RAM)中。由于使用了内存,Redis具有易失性,这意味着当系统关闭时,数据也会丢失。因此,Redis通常不用作像MongoDB或PostgreSQL那样的持久化数据库,而是用于缓存。如今,它的功能更加强大,我将在下文中讨论。
🌟 超快数据访问:Redis 访问数据只需几毫秒,而使用传统方法则需要几百毫秒。
何时使用Redis?
Redis 并非数据库的替代品,而是构建于传统数据库之上。任何需要频繁访问的数据都可以存储在 Redis 中。
- 当您需要频繁访问某些数据时
- 当数据库查询语句很长,执行时间很长时,就会出现问题。
Redis 安装
- Ubuntu -来自官方 Ubuntu PPA
$ sudo add-apt-repository ppa:redislabs/redis
$ sudo apt-get update
$ sudo apt-get install redis
- Mac -使用 Homebrew
brew update
brew install redis
- Windows - 使用WSL在 Windows 上安装 Redis
Redis 基本命令
启动命令
redis-server- 要启动 Redis 服务器,请使用以下命令- 要使用 Redis CLI,请打开一个新的终端并
redis-cli输入命令;要关闭终端,请使用quit命令。
基本命令
-
SET name your-name- 设置值 -
GET name- 获取上述值 -
DEL name- 通过以下方式删除键值对 -
EXISTS name- 检查密钥是否存在 -
KEYS *获取所有密钥 -
flushall- 清除所有数据
到期日
ttl key-name- 检查密钥在自动删除前还有多少时间。如果结果为空,-1则表示未设置TTL(生存时间),密钥不会过期。expire key-name 10- 设置TTL为 10 秒。setex name 10 your-name- 在设置键值对时设置TTL 。
列表
当我们需要实现队列或栈时,列表就非常有用。例如在即时通讯应用中,我们可以缓存一些最近的消息。
lpush fruits apple将项目推到列表的左侧。rpush fruits mango将项目推到列表右侧。lrange fruits 0 -1- 获取列表中的所有项目。-1表示列表末尾的索引。LPOP fruits- 删除列表中最左边的项目。RPOP fruits- 删除列表中最右边的项目。
套
集合与列表类似。集合的不同之处在于它只存储唯一值。
SADD todo "read book"- 将项目添加到集合中。(注意:如果我们尝试再次添加“读过的书”,则不会添加成功,因为它是重复的。)SMEMBERS todo- 显示待办事项集中的所有项目。SREM todo "read book"- 从集合中移除物品。
哈希
LISTRedis 中的s 和SETs 存储的是项目序列,而Redis HASHes 存储的是键到值的映射。
HSET person name John- 这里,名字是键,John是值。HGET person name- 这将返回与键名关联的值,在本例中返回John。HGETALL person获取该人的所有信息。HDEL person name- 删除 name 属性。HEXISTS person name- 检查该属性是否存在。
使用 Redis 让你的网站速度提升 30-40%
安装 Redis
npm i redis
启动 Redis 服务器
redis-server
导入软件包并创建实例
// Import redis package
const Redis = require('redis')
// Create redis client, in case ofer development only
const redisClient = Redis.createClient()
// Incase of production pass your production instance url and use the below line
const redisClient = Redis.createClient({ url: "your-production-url"})
使用上述redisClient实例执行我上面提到的所有命令。例如:
redisClient.setex('photos', 3600, JSON.stringyfy(some-value-to-store))
在添加 Redis 缓存之前
以下代码获取 900kB 大小的数据大约需要480 毫秒。
app.get("/photos", async(req, res) => {
const albumId = req.query.albumId
const { data } = await axios.get(
"https://jsonplaceholder.typicode.com/photos"
{ params: { albumId }}
)
})
添加 Redis 缓存后
下面的代码第一次获取数据大约需要480 毫秒,而后续的重复获取数据仅需37 毫秒。这真是巨大的性能提升。
// Import redis package
const Redis = require('redis');
// Create redis client, in case ofer development only
const redisClient = Redis.createClient();
// Incase of production pass your production instance url and use the below line
const redisClient = Redis.createClient({ url: 'your-production-url' });
app.get('/photos', async (req, res) => {
const albumId = req.query.albumId;
redisClient.get('photos', async (error, photos) => {
if (error) console.error(error);
if (photos != null) {
return res.json(JSON.parse(photos));
} else {
const { data } = await axios.get('https://jsonplaceholder.typicode.com/photos', {
params: { albumId }
});
redisClient.setex('photos', 3600, JSON.stringyfy(data));
res.json(data);
}
});
});
在上面的例子中,我们首先检查是否已经将照片缓存到 Redis 缓存中,如果已缓存,则返回缓存值,否则从 API 获取照片。
使用 Redis 作为主要数据库
Redis 本身速度极快,无需额外的缓存层,但数据库的一项必要功能是能够对复杂的关系进行建模。别担心,Redis 完全可以满足你的需求。Redis 可以用作多模型数据库,它借助各种模块支持多种数据库范式。一些最常用的 Redis 模块包括:
- RediSearch - 基于 Redis 的全文搜索。
- RedisGraph - 一个使用稀疏邻接矩阵的基于 Cypher 的查询语言的图数据库。
- RedisBloom - 可扩展的布隆过滤器。
- RedisJson - Redis 的一种 JSON 数据类型。
- RedisAI - 一个用于服务张量和执行深度学习图的 Redis 模块。
- Neural-redis - 将在线可训练神经网络作为 Redis 数据类型。
- RedisTimeSeries - Redis 的时间序列数据结构。
查看redis.io/modules中的所有模块。您可以在Redis 企业云免费套餐中试用这些模块。