持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
前言
在业务中我们经常面临缓存的使用问题。而 Redis 作为Key-Value形态的内存数据库,可以很好的帮助我们完成这个需求。
Redis 安装和配置
首先是安装 Redis,因为 Redis官方 不支持 Windows 环境,需要先启用 WSL2 才行,比较麻烦。所以用 CentOS 环境来展示。
安装 Redis
如果你之前已经安装了,此刻想要更新到最新版本,你可以:
# 找到 redis服务,使用 kill 停掉服务
ps -ef | grep redis
# 或者进入redis-cli,输入info命令查看process_id
kill -9 [pid]
获取安装包
你可以在 download.redis.io/releases/ 查找想要安装的版本。我们直接安装目前最新的稳定版:
wget https://download.redis.io/releases/redis-7.0.5.tar.gz
解压安装包
tar -zxvf redis-7.0.5.tar.gz & cd redis-7.0.5
make命令进行编译
进入到解压之后的目录,使用 make 命令进行编译:
安装启动文件
cd src/ & make install
启动服务
安装完成后,进入到 /usr/local/bin 目录下,启动 redis-server:
cd /usr/local/bin & ./redis-server
看到这个界面就大功告成了!
设置开机自启
- 修改配置文件
redis.conf的daemonize字段:
- 在系统服务目录里创建redis.service文件
vim /etc/systemd/system/redis.service
# 将下面内容写入
[Unit]
Description=redis-server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
# 第一个为默认安装的启动文件路径,第二个文件是你配置文件的路径
ExecStart=/usr/local/bin/redis-server /root/redis/redis-7.0.5/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
- 设置服务:
# 先重新加载systemd服务
systemctl daemon-reload
# 关闭redis-server
systemctl stop redis.service
# 开启redis-server
systemctl start redis.service #如果服务是开启状态,使用此命令会启动失败。
💡 如果 systemctl 启动失败,请
ps -ef | grep redis找到 redis 进程并将其 kill 掉。
💡 如果有重复的service文件,那可能是你之前配置过。使用
find / -name redis.service找到之前写的文件并删除。
- 设置开机自启
systemctl enable redis.service
reboot 后即可。
基本了解
启动完成后等待连接,我们先不通过程序来连接,而是通过命令行来连接进行学习。启动新的窗口,输入 redis-cli 进入交互命令行环境:
redis-cli
127.0.0.1:6379>
控制台显示主机为: 127.0.0.1,端口号为:6379,默认进入第一个数据库,且不会显示这个数据库的名字。
查看 Redis
刚安装完成,你还没有设置密码,此时你可以直接输入命令与客户端进行交互。输入 info:
127.0.0.1:6379> info
可以看到包括但不限于以下信息,涵盖了 运行主机环境、客户端连接、内存占用、CPU占用等信息:
# Server
redis_version:7.0.5
os:Linux 3.10.0-1160.59.1.el7.x86_64 x86_64
arch_bits:64
gcc_version:4.8.5
process_id:2465
tcp_port:6379
executable:/usr/local/bin/./redis-server
# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
# Memory
# Persistence
# Stats
# Replication
# CPU
used_cpu_sys:0.012110
used_cpu_user:0.024221
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
used_cpu_sys_main_thread:0.012083
used_cpu_user_main_thread:0.024167
# Modules
# Errorstats
# Cluster
cluster_enabled:0
# Keyspace
现在往数据库里面插入一条数据,然后读取出来。
127.0.0.1:6379> set name aaa
OK
127.0.0.1:6379> get name
"aaa"
这就简简单单的入门了,接下来学基本功能:「增、删、查、改」。
Redis 基础内容
Redis (Remote Dictionary Server)即远程字典服务,是一个开源的、使用ANSI``C编写、支持网络、可基于内存亦可持久化的日志型的Key-Value数据库,并提供多种语言的API。
基本语法
Redis 数据库的数量是固定的,并在配置文件中设置。默认情况下,有 16 个数据库。无需担心数据库不够用的,因为开发中 Redis 基本是当作缓存使用,不需要用它来存储大量数据,所以完全够用。另外每个数据库都用数字标识。
可以使用命令来获取数据库的数量:
127.0.0.1:6379> CONFIG GET DATABASES
1) "databases"
2) "16"
开发者则需要自己记录存储的数据与数据库的对应关系,数据库名字没有语意化。另外 Redis 也不支持为每个数据库设置不同的访问密码。
Redis 中的值可以是 字符串(String)、 哈希(Hash)、 列表(list)、 集合(set) 和 有序集合(sorted set) 等类型。通常被称为数据结构服务器。
Redis 的命令很多,现在你还不需要掌握太多,在用到的时候去官网查即可:redis.io/commands 。另外 Redis 中的命令同 SQL 中一样不区分大小写。以下是常用的命令:
# 启动
redis-server
# or
redis-server --port 6380
# 停止
redis-cli SHUTDOWN
# or
kill -9 [PID]
# 连接 Redis
redis-cli
# or
redis-cli -h 127.0.0.1 -p 6379
# 测试客户端与 Redis 连接是否正常,正常会收到回复 PONG
redis-cli PING
# 所有数据库 key 的情况:
INFO Keyspace
# 切换数据库:
SELECT [0-15 any index]
# 查看数据库大小:
DBSIZE
# 查看当前数据库所有的 key 值 :
KEYS *
# 清空所有数据库的数据:
FLUSHALL
# 清空当前数据库的数据:
FLUSHDB
# 是否存在 key :存在返回 1 不存在返回 0
EXISTS [name]
# 设置过期事件(秒):
EXPIRE [name] 10
# 剩余过期时间(time to live):
ttl [name]
# 移动 key 到 另外数据库
MOVE [name] [datebase_index]
# 设置 key 的值:
SET name CondorHero
# 查看 key 的值:
GET [name]
# 批量设置
MSET
# 批量获取
MGET
# 删除 key:
DEL [name]
# 如果获取不到 age 的值,就设置age=20并返回,如果能获取到 age 的值,直接返回 age 的值
GETSET age 20
# 查看当前key的类型
type [name]
# 在 key 对应的 value 末尾增加字符串"end":
APPEND [name] "end"
# 获取当前 key 的长度:
STRLEN name
# 获取指定范围 key 的值(字符串截取):
GETRANGE [name] 0 0 // 获取第一个
GETRANGE [name] 0 -1 //获取全部
💡 默认端口号
6379的来历:Redis 作者女儿的名字 "MERZ " 对应九宫格输入法的 "6379"。oldblog.antirez.com/post/redis-…
Nodejs 连接 Redis
安装依赖
# 创建目录环境
mkdir redis-demo & cd redis-demo
pnpm init
pnpm add -D redis@3.1.2
💡 由于
redisnpm包的V4版本API变动较大,所以在安装时先建议指定安装3.1.2版本
测试连接
const redis = require("redis");
const config = {
host: 'YOUR_SERVER_ADDRESS',
port: 6379,
// password: 'YOUR_PASSWORD'
}
// 连接 Redis
const client = redis.createClient(config.port, config.host);
// 错误监听器
client.on("error", function (error) {
console.error(error);
});
client.on('connect', () => {
console.log('redis connect success')
})
// 存储一个 key value
/*
redis.print 是一个函数,用来打印出,API执行完之后的结果
该处可以换成一个自定义的回调函数
*/
client.set("name", "sarainoq", redis.print);
// 读取 name 这个 key 的值
client.get("name", redis.print);
// 退出 Redis
client.quit();
💡 这些API都是异步的!
你可能会遇到如下问题:
虽然你可以直接通过 config set protected-mode no 解决这个问题,但我建议你设置密码。
设置密码
- 配置文件中设置(永久生效)
在安装路径下找到 redis.conf 文件:
vim redis.conf
:/requirepass
# 按n查找下一个
# 修改后保存并退出
:wq
- 命令行中设置(重启后失效)
直接在 redis-cli 中输入 config set requirepass [YOUR_PASSWORD]。退出命令行重新进入,就需要输密码了。
💡 然后在代码中加上:
client.auth(config.password);即可。切记,密码不要设置的太简单!
简单封装使用
const redis = require('redis')
const config = {
url: '',
port: 6379,
password: ''
}
// 实例redis对象
const client = redis.createClient(config.port, config.url)
// 连接错误处理
client.on('error', err => {
console.log('redis connect err', err)
})
client.on('connect', () => {
console.log('redis connect success')
})
//验证redis
client.auth(config.password)
const redisHelper = {}
/**
* redisHelper setString function
* @param key
* @param value
* @param expire
*/
redisHelper.setString = (key, value, expire) => {
return new Promise((resolve, reject) => {
client.set(key, value, function (err, result) {
if (err) {
reject(err)
}
if (!isNaN(expire) && expire > 0) {
client.expire(key, parseInt(expire))
}
resolve(result)
})
})
}
/**
* redisHelper getString function
* @param key
*/
redisHelper.getString = (key) => {
return new Promise((resolve, reject) => {
client.get(key, function (err, result) {
if (err) {
reject(err)
}
resolve(result)
})
})
}
module.exports = redisHelper
总结
本文介绍了 Redis 的安装、配置、使用和在 Nodejs 中的简单封装。Redis 在业务中通常作为缓存使用,比如说短信验证码、消息队列、全局共享变量等,具体代码之后再讲。