【Day 57】Linux-Redis
一、Redis 简单介绍
作用:在现代应用架构中,Redis 扮演着至关重要的角色,其核心作用体现在作为高性能的缓存服务器,能够显著提升业务的访问速度。通过将频繁访问的数据存储在 Redis 中,应用程序可以避免频繁地访问数据库,从而减少响应时间,提高系统的吞吐量。
应用场景:缓存服务器,提升业务的访问速度
Redis 作为缓存服务器,适用于多种业务场景,例如电商网站的商品详情页、新闻网站的热门新闻列表、社交应用的用户信息等。在这些场景中,数据的访问频率高,通过 Redis 缓存可以有效减轻数据库的压力,提升用户体验。
应该缓存哪些数据?
-
静态数据:这类数据不经常发生变化,如网站的静态资源(图片路径、样式表、脚本等)、系统的配置信息等。将静态数据缓存到 Redis 中,可以减少对静态资源服务器的访问,提高加载速度。
-
热点数据:指在一定时间内被频繁访问的数据,例如电商平台的促销商品、热门游戏的排行榜数据等。缓存热点数据能够避免数据库因大量重复查询而产生的性能瓶颈。
-
具有过期时间的数据:对于一些临时有效的数据,如用户的登录令牌、验证码等,通过设置过期时间,Redis 可以自动对其进行清理,无需人工干预,保证数据的时效性。
核心关注点:缓存命中率
缓存命中率是衡量 Redis 缓存效果的关键指标,它指的是从缓存中成功获取数据的请求次数与总请求次数的比值。较高的缓存命中率意味着更多的请求可以通过缓存得到响应,从而更好地发挥 Redis 的作用。为了提高缓存命中率,需要合理地选择缓存的数据、设置合适的过期时间,并采用有效的缓存淘汰策略。
Redis 特性
-
基于内存存储数据:Redis 将数据存储在内存中,这使得它的读写速度非常快,能够达到毫秒级甚至微秒级的响应时间。
-
以 key-value 键值对的方式存储数据:这种简单的数据结构使得 Redis 的操作非常高效,同时也支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,能够满足不同的业务需求。
-
支持数据持久化存储:Redis 提供了两种数据持久化方式,即 rdb 数据文件和 aof 日志。rdb 方式是在指定的时间间隔内将内存中的数据快照写入磁盘;aof 方式则是将每一个写操作都记录到日志文件中,当 Redis 重启时,可以通过重新执行这些命令来恢复数据。
-
支持多实例:可以在同一台服务器上运行多个 Redis 实例,每个实例都有自己独立的配置和数据,从而更好地利用服务器资源。
-
主从复制:通过主从复制,可以实现 Redis 数据的备份和读写分离。主节点负责处理写操作,从节点则复制主节点的数据,并负责处理读操作,提高系统的读性能。
-
分片集群:当数据量过大时,单个 Redis 实例可能无法满足需求,此时可以采用分片集群的方式,将数据分散存储到多个 Redis 节点上,提高系统的存储容量和处理能力。
-
哨兵集群:哨兵集群用于监控 Redis 主从节点的运行状态,当主节点出现故障时,能够自动将从节点升级为主节点,保证系统的高可用性。
二、Redis 安装部署
官网文档:Downloads | Redis
1、安装 gcc。Redis 是用 C 语言开发的,因此在编译安装 Redis 之前,需要先安装 gcc 编译器。
[root@localhost ~] yum install -y gcc2、准备 Redis 安装包并解压
wget http://download.redis.io/releases/redis-5.0.12.tar.gz # 假设通过wget下载,若已下载可跳过此步
[root@localhost ~] tar xf redis-5.0.12.tar.gz
[root@localhost ~] cd redis-5.0.12/3、进入解压后的 Redis 目录,进行编译和安装redis。
[root@localhost redis-5.0.12] make
[root@localhost redis-5.0.12] make PREFIX=/usr/local/redis50 install
# PREFIX:编译安装时的路径参数,指定 Redis 最终会被安装到什么目录下。
# install:将编译好的 Redis 可执行程序(如 redis-server、redis-cli 等)、配置文件模板等复制到 PREFIX 指定的目录中。4、配置环境变量。为了方便在任何目录下都能使用 Redis 的命令,需要将 Redis 的安装目录添加到系统的环境变量中。
[root@localhost ~] vim /etc/profile
export PATH=$PATH:/usr/local/redis50/bin
[root@localhost ~] source /etc/profile5、在安装目录下创建 conf 文件夹,并将 Redis 源码目录中的 redis.conf 配置文件复制到该文件夹中。
[root@localhost ~] mkdir -p /usr/local/redis50/conf
[root@localhost ~] cp redis-5.0.12/redis.conf /usr/local/redis50/conf/6、修改配置文件,设置 Redis 以守护进程的方式运行(Redis 会在后台运行)。
[root@localhost ~] vim /usr/local/redis50/conf/redis.conf
daemonize yes # 将该参数设置为yes,使Redis以守护进程方式运行7、通过指定配置文件启动服务
[root@localhost ~] redis-server /usr/local/redis50/conf/redis.conf
# 73893:C 15 Sep 2025 09:58:25.748 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
# 73893:C 15 Sep 2025 09:58:25.748 # Redis version=5.0.12, bits=64, commit=00000000, modified=0, pid=73893, just started
# 73893:C 15 Sep 2025 09:58:25.748 # Configuration loaded
[root@localhost ~] netstat -tunlp | grep redis
# tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 73894/redis-server8、测试数据读写
[root@localhost ~] redis-cli
127.0.0.1:6379> set name Sylvia
# OK
127.0.0.1:6379> get name
# "Sylvia"
127.0.0.1:6379> set url "http://www.jd.com" EX 10
# OK
127.0.0.1:6379> get url
# "http://www.jd.com"
127.0.0.1:6379> get url
# (nil)
127.0.0.1:6379> get name
# "Sylvia"
127.0.0.1:6379> exit9、关闭redis服务
[root@localhost ~] redis-cli shutdown
// 此外,还可以通过杀死 Redis 进程的方式关闭服务,但这种方式可能会导致数据丢失,不推荐使用。
三、Redis bin 目录解析
文件名 | 功能说明 |
---|---|
redis-server | Redis 服务器程序,用于启动 Redis 服务的核心进程。 |
redis-cli | Redis 命令行客户端工具,用于连接 Redis 服务并执行命令(如数据读写、配置修改) 使用方式:redis-cli(连接本地默认服务) redis-cli -h 主机IP -p 端口(连接远程服务) |
redis-benchmark | Redis 性能测试工具,用于模拟多种请求场景(如 GET/SET 操作),测试 Redis 服务的吞吐量、响应时间等性能指标。 示例:redis-benchmark -c 100 -n 100000(100 个并发客户端,执行 10 万次请求)。 |
redis-check-aof | AOF 日志文件检查和修复工具。当 AOF 文件(持久化日志)因异常损坏时,可通过此工具修复。 使用方式:redis-check-aof --fix /path/to/appendonly.aof。 |
redis-check-rdb | RDB 快照文件检查和修复工具。当 RDB 文件(内存快照)损坏时,用于检查完整性并尝试修复。 使用方式:redis-check-rdb /path/to/dump.rdb。 |
redis-sentinel | Redis 哨兵程序,用于监控 Redis 主从集群的状态。当主节点故障时,自动将从节点升级为新主节点,保证集群高可用。 使用方式:redis-sentinel /path/to/sentinel.conf(指定哨兵配置文件启动)。 |
四、Redis 配置文件解析
Redis 的配置文件(通常为 redis.conf)是管理 Redis 服务行为的核心,包含了监听设置、持久化、安全、性能等多方面的配置。以下是对各配置项的详细解析:
(一)NETWORK
1.保护模式(protected-mode)
- protected-mode yes
- 作用:限制未授权的外部连接,增强 Redis 安全性。
- 触发条件:当满足以下所有条件时,保护模式会拒绝外部连接:
- 未配置
bind
指令(即监听所有网络接口); - 未设置密码(
requirepass
未配置); - 尝试从非本地(非
127.0.0.1
)地址连接。
- 未配置
- 行为:
- yes(默认):拒绝未授权的外部连接,仅允许本地连接或已授权连接(如配置密码后)。
- no:关闭保护模式,允许任意地址连接(即使未配置 bind 和密码,公网环境禁用)。
- 使用建议:生产环境保持
yes
,如需外部访问,需配合bind
限制 IP 并配置密码。
2.监听地址( bind)
-
bind x.x.x.x // 默认为 127.0.0.1
-
作用:指定 Redis 服务监听的 IP 地址。默认为 127.0.0.1(仅本地可访问)。
若需允许远程连接,可修改为服务器的实际 IP(如 192.168.140.10),或设置为 0.0.0.0(监听所有网卡)。 -
注意:生产环境中不建议设置为 0.0.0.0,需配合密码和防火墙限制访问。
-
protected-mode yes # 默认值,限制未授权的外部连接,增强 Redis 安全性。
3. 监听端口( port )
-
port 6379 // 默认 6379
-
作用:指定 Redis 服务的端口号,默认 6379(取自 Redis 作者的名字谐音)。
-
port 0:禁用 TCP 监听(仅允许通过 Unix 套接字连接,需同时配置 unixsocket)。
-
说明:若需运行多个 Redis 实例,需修改端口号避免冲突(如 6380、6381)。
4. TCP 连接队列长度( tcp-backlog)
-
tcp-backlog 511 // 默认511
-
作用:设置 Redis 接收客户端连接的队列长度,队列满后新连接会被拒绝。
-
关联系统参数:该值受系统内核参数限制,需同步修改以下参数确保生效:
# 编辑系统配置文件
vim /etc/sysctl.conf
# 系统级别的网卡接收队列长度(需 ≥ tcp-backlog)
net.core.somaxconn = 1000
# TCP 三次握手时的半连接队列长度
net.ipv4.tcp_max_syn_backlog = 1000# 生效配置
sysctl -p
-
查看所有系统参数:sysctl -a(可用于验证配置是否生效)。
5.Unix socket
作用:通过 Unix 套接字(本地进程间通信方式)提供连接,比 TCP 更高效(无网络开销)。
- # unixsocket /tmp/redis.sock //套接字文件路径
- # unixsocketperm 700 //套接字文件权限
使用方式:客户端通过套接字连接
redis-cli -s /tmp/redis.sock # 替代 -h 和 -p 参数
6.客户端空闲超时时间( timeout)
-
timeout 30
-
作用:设置客户端连接的空闲超时时间(单位:秒)。若客户端超过该时间无操作,Redis 会主动关闭连接。
-
说明:默认值为
0
(不超时),建议根据业务场景设置(如 30 秒),避免无效连接占用资源。
(二)GENERAL 部分
1. 守护进程模式
- daemonize yes // 默认值为 no,建议生产环境设为 yes
-
作用:控制 Redis 是否以守护进程(后台进程)方式运行。
-
yes:Redis 在后台运行,不占用当前终端,适合生产环境。
-
no:Redis 在前台运行,终端关闭则服务停止,适合调试。
-
-
注意:设置为 yes 时,Redis 会自动生成 PID 文件(默认 /var/run/redis.pid,可通过 pidfile 自定义)
2. 进程监控模式
- supervised no
-
作用:配置 Redis 与进程管理工具(如 upstart、systemd)的交互方式,用于监控 Redis 状态。
-
可选值:
-
no
:不与任何监控工具交互(默认)。 -
upstart
:向 upstart 发送 SIGSTOP 信号,配合 upstart 管理。 -
systemd
:向 systemd 写入READY=1
信号(通过$NOTIFY_SOCKET
环境变量)。 -
auto
:自动检测环境中的 upstart 或 systemd 并适配。
-
-
适用场景:仅在使用 systemd/upstart 作为服务管理器时需要修改(如 Linux 系统通过
systemctl
管理 Redis 服务)。
3 . PID 文件路径( pidfile)
-
pidfile /var/run/redis_6379.pid
-
作用:指定 Redis 进程 ID(PID)的存储文件路径,便于管理进程(如停止、重启服务)。
-
说明:文件名通常包含端口号(如 redis_6379.pid),便于识别不同实例的进程。
-
注意:
-
若 daemonize yes 且未指定 pidfile,默认路径为 /var/run/redis.pid。
-
Redis 启动时会尝试创建该文件,若失败(如权限不足),服务仍可正常运行,但无法通过 PID 文件管理进程。
-
4. 日志配置(loglevel 和 logfile)
-
配置格式:
loglevel warning # 日志级别 logfile "/var/log/redis_6379.log" # 日志文件路径
-
日志级别:
-
debug:详细调试信息(开发环境用)。
-
verbose:普通信息。
-
notice:重要通知。
-
warning:警告信息(生产环境推荐)。
-
说明:日志文件需确保 Redis 进程有写入权限,便于问题排查。
-
作用:设置日志输出的详细程度,控制日志信息量。
-
-
日志文件路径(logfile)
-
空字符串(默认):日志输出到标准输出(前台运行时显示在终端,守护进程模式下输出到 /dev/null)。
-
自定义路径(如 logfile "/var/log/redis/redis_6379.log"):日志写入指定文件,需确保 Redis 对目录有写入权限。
-
建议:生产环境设置为具体路径(如 /var/log/redis/ 下),便于日志收集和问题排查。
-
5. 系统日志配置
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
-
作用:配置 Redis 是否将日志发送到系统日志(如
/var/log/messages
),默认禁用。 -
参数说明:
-
syslog-enabled yes:启用系统日志。
-
syslog-ident:指定日志标识(默认 redis),用于区分不同服务的日志。
-
syslog-facility:指定日志设备(需为 USER 或 LOCAL0-LOCAL7)。
-
-
适用场景:需要集中管理日志(如通过 rsyslog 收集)时启用。
6. 数据库数量(databases)
-
databases 16
- 作用:设置 Redis 支持的数据库数量(编号 0-15),不同数据库可隔离数据(如按业务模块划分)。
-
使用方式:通过
SELECT <dbid>
命令切换数据库(如SELECT 7
切换到第 8 个数据库)。 -
注意:数据库之间完全隔离,同一键名在不同数据库中视为不同键。
-
不同数据库可隔离不同业务的缓存数据(如数据库 0 存用户信息,数据库 7 存商品信息)。
-
默认使用数据库 0,可通过 SELECT <编号> 切换:
-
7. 启动 Logo(always-show-logo)
- always-show-logo yes
- 作用:控制 Redis 启动时是否显示 ASCII 艺术 Logo(Redis 标志)。
-
说明:
-
默认仅在前台运行且输出到终端(TTY)时显示 Logo。
-
设置为 yes 时,无论运行模式如何,启动日志中都会显示 Logo。
-
-
实际影响:仅为视觉效果,不影响服务功能。
(三)SNAPSHOTTING和PERSISTENCE
Redis 支持两种持久化方式,用于将内存数据保存到磁盘,防止重启后数据丢失。
(1)RDB 方式(快照持久化)
-
配置格式:
# RDB 文件名 dbfilename dump_6379.rdb # RDB 文件存储路径(需手动创建目录) dir /usr/local/redis50/data
-
触发方式:
-
手动触发:通过 bgsave 命令(后台异步执行,不阻塞服务):
redis-cli -h 192.168.140.10 192.168.140.10:6379> bgsave Background saving started # 开始后台保存
-
自动触发:通过 save 配置设置触发条件(save <秒数> <修改次数>):
# 900 秒内有 1 次修改则触发 save 900 1 # 300 秒内有 10 次修改则触发 save 300 10 # 60 秒内有 10000 次修改则触发 save 60 10000
-
(2)AOF 方式(日志持久化)
-
配置格式:
# 开启 AOF(默认关闭) appendonly yes # AOF 文件名 appendfilename "appendonly_6379.aof"
-
原理:记录每一条写操作到日志文件,重启时通过重放日志恢复数据。
-
优势:比 RDB 更可靠,数据丢失风险低(可配置每秒或每操作同步一次)。
(四)SECURITY
-
requirepass foobared //默认注释(无密码)
-
作用:设置 Redis 访问密码,增强安全性。
-
使用方式:客户端连接后需通过
auth
命令认证:redis-cli -h 192.168.140.10 192.168.140.10:6379> auth 123456 # 密码认证 OK # 认证成功 192.168.140.10:6379> set a 10 # 认证后可执行操作 OK
(五)CLIENTS
-
maxclients 50000 //最大并发连接
-
作用:限制 Redis 最大客户端连接数,默认无限制(受系统文件描述符限制)。
-
说明:需根据服务器性能设置(如 50000),避免连接过多导致服务崩溃。
(六)MEMORY MANAGEMENT
(1)内存使用限制
-
# maxmemory <bytes>
-
作用:设置 Redis 可使用的最大内存(单位:字节)。当内存达到此限制时,Redis 会根据 maxmemory-policy 配置的策略淘汰旧键,或拒绝新的写操作。
-
使用场景:
-
作为 LRU/LFU 缓存时,限制内存使用以避免占用过多系统资源。
-
使用 noeviction 策略时,作为实例的硬性内存上限。
-
-
注意事项:
-
若节点有从节点(replica),Redis 会从已用内存中扣除用于同步的输出缓冲区大小,避免因网络问题导致的「淘汰循环」(不断淘汰键 → 从节点缓冲区充满 DEL 命令 → 进一步触发淘汰)。
-
建议为带从节点的主节点设置更低的 maxmemory,预留内存给从节点的输出缓冲区。
-
(2)内存淘汰策略
-
# maxmemory 700M // 最大可用内存(根据服务器内存设置,如 700M)
-
# maxmemory-policy noeviction //默认值
当内存达到 maxmemory 限制时,Redis 会根据以下策略选择淘汰键:
策略 | 说明 |
---|---|
| 从设置了过期时间的键中,淘汰「最近最少使用」(LRU)的键 |
| 从所有键中,淘汰「最近最少使用」(LRU)的键 |
| 从设置了过期时间的键中,淘汰「最近访问频率最低」(LFU)的键 |
| 从所有键中,淘汰「最近访问频率最低」(LFU)的键 |
| 从设置了过期时间的键中,随机淘汰一个键 |
| 从所有键中,随机淘汰一个键 |
| 从设置了过期时间的键中,淘汰「剩余过期时间最短」(TTL 最小)的键 |
| 不淘汰任何键,对写操作返回错误(默认策略) |
-
LRU(Least Recently Used):基于「最近使用时间」,淘汰最长时间未被访问的键。
-
LFU(Least Frequently Used):基于「访问频率」,淘汰一段时间内被访问次数最少的键。
-
两种算法均为近似实现(通过随机采样优化性能),而非精确计算。
-
推荐策略:
-
若主要缓存带过期时间的数据,用 volatile-lru 或 volatile-lfu。
-
若所有数据都可能被淘汰,用 allkeys-lru 或 allkeys-lfu。
-
-
写操作限制:当没有符合条件的键可淘汰时,Redis 会对以下写命令返回错误(读命令不受影响):set、lpush、sadd、hset、zadd 等(完整列表见配置注释)。
3. 淘汰算法精度调优(maxmemory-samples)
- # maxmemory-samples 5 # 默认值
-
作用:设置 LRU/LFU/TTL 算法的采样数量。Redis 会随机抽取指定数量的键,从中选择最符合淘汰条件的键。
-
权衡:
-
采样数越多(如 10),结果越接近真实的 LRU/LFU,但消耗更多 CPU。
-
采样数越少(如 3),性能更好,但精度较低。
-
-
默认值:5(平衡精度和性能的推荐值)。
4. 从节点内存策略(replica-ignore-maxmemory)
- # replica-ignore-maxmemory yes # 默认值(Redis 5+)
- 作用:控制从节点是否忽略自身的
maxmemory
配置。 - 默认行为:
- 从节点默认不执行内存淘汰(忽略自身
maxmemory
),仅通过主节点的淘汰操作同步(主节点淘汰键后,发送DEL
命令给从节点)。 - 确保主从数据一致性,是推荐配置。
- 从节点默认不执行内存淘汰(忽略自身
- 修改建议:
- 需监控从节点内存,避免因从节点内存不足导致 OOM(从节点内存可能因缓冲区或数据结构差异略大于主节点)。
- 仅当从节点可写,且写入操作是「幂等的」(重复执行结果一致)时,才可关闭此配置(
no
),允许从节点独立执行淘汰。
(七)REPLICATION(主从复制)
用于配置 Redis 主从复制(主库与从库的数据同步),核心配置包括:
- replicaof <masterip> <masterport>:指定当前实例为从库,设置主库的 IP 和端口(Redis 5.0 前用 slaveof,5.0 后推荐 replicaof)。
- masterauth <password>:如果主库有密码认证,从库连接主库时需要的密码。
- replica-read-only yes:设置从库为只读模式(默认 yes,避免从库写入数据)。
- repl-diskless-sync:是否使用无盘复制(默认 no,开启后从库通过网络直接接收主库数据,不写临时文件)。
(八)CLUSTER(集群配置)
当使用 Redis 集群(Redis Cluster)时,相关配置包括:
- cluster-enabled yes:是否开启集群模式(默认 no)。
- cluster-config-file:集群配置文件路径(自动生成和更新,记录集群节点信息)。
- cluster-node-timeout:集群节点超时时间(默认 15000 毫秒,超过此时长未响应则认为节点下线)。
- cluster-replica-validity-factor:从库选举主库时的有效性因子(默认 10,用于计算超时时间)
(九)LIMITS(资源限制)
- maxclients:最大客户端连接数(默认 10000,超过后拒绝新连接)。
- maxmemory:Redis 可使用的最大内存(默认 0,即不限制,建议根据服务器配置设置)。
- maxmemory-policy:内存达到上限时的淘汰策略(如 volatile-lru、allkeys-lru 等)。
(十)SLOW LOG(慢查询日志)
用于监控和排查慢命令,配置包括:
- slowlog-log-slower-than:记录执行时间超过多少微秒的命令(默认 10000)。
- slowlog-max-len:慢查询日志的最大条数(默认 128,超过后覆盖旧日志)。
(十一)LATENCY MONITOR(延迟监控)
- latency-monitor-threshold:延迟监控阈值(默认 0,关闭;设置为 N 微秒时,记录超过 N 的延迟事件)。