基于CentOS环境手把手带你入门 Redis

129 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

看到这个界面就大功告成了!

设置开机自启

  1. 修改配置文件 redis.confdaemonize 字段:

  1. 在系统服务目录里创建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
  1. 设置服务:
# 先重新加载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 找到之前写的文件并删除。

  1. 设置开机自启
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

💡 由于 redis npm包的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 解决这个问题,但我建议你设置密码。

设置密码

  1. 配置文件中设置(永久生效)

在安装路径下找到 redis.conf 文件:

vim redis.conf
:/requirepass
# 按n查找下一个

# 修改后保存并退出
:wq

  1. 命令行中设置(重启后失效)

直接在 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 在业务中通常作为缓存使用,比如说短信验证码、消息队列、全局共享变量等,具体代码之后再讲。