redis 单机安装
一、环境准备
1.1 操作系统要求
Redis 支持主流 Linux 发行版,推荐:
- Ubuntu 20.04 / 22.04 LTS
- CentOS 7 / 8 / Rocky Linux 8 / 9
- Debian 11 / 12
The latest version of Redis Open Source has been tested on the following platforms:
- Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), and 26.04 (Resolute Raccoon).
- Rocky Linux 8.10, 9.7, and 10.1.
- AlmaLinux 8.10, 9.7, and 10.1.
- Debian 12.13 (Bookworm) and Debian 13.4 (Trixie).
- Alpine 3.23.
- macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), and 26.3 (Tahoe) - for both Intel and ARM processors.
1.2 创建redis用户
# redis 用户 # 一般systemd 服务使用 不登录 redis用户
sudo useradd -r -s /sbin/nologin redis
# redis 用户 # 手动管理服务
useradd -s /bin/bash redis
1.3 安装编译依赖
Ubuntu / Debian:
sudo apt update sudo apt install -y build-essential tcl pkg-config
CentOS / Rocky Linux:
sudo yum groupinstall -y "Development Tools"
sudo yum install -y tcl
Development Tools
安装系统开发工具组套件,一次性装好编译源码必备全套工具。
包含软件 gcc、g++、make、cmake、git、automake、autoconf、gcc-c++、patch、libtool 等编译、构建工具。
groupinstall:安装软件软件组
💡
tcl用于运行 Redis 自带的测试套件;build-essential/Development Tools提供 gcc、make 等编译工具。
1.4 修改系统 limits
文件描述符限制由 Linux 系统的
ulimit机制控制,核心目标是让 Redis 进程的「最大打开文件数」大于maxclients(10000),避免出现Too many open files报错、新连接被拒绝
修改系统 limits 配置文件
# 修改前检查
su -s /bin/bash redis -c "ulimit -n"
cat /etc/security/limits.conf | grep -v '#'
# 新创建的会话生效
# soft:软限制,用户登录后默认生效的数值
# hard:硬限制,用户可自行上调的最大上限
echo "redis soft nofile 65535" >> /etc/security/limits.conf
echo "redis hard nofile 65535" >> /etc/security/limits.conf
验证
su -s /bin/bash redis -c "ulimit -n"
启动后验证
cat /proc/$(pidof redis-server)/limits | grep "Max open files"
1.5 关闭透明大页
透明大页可能导致内存分配延迟和性能抖动,数据库、缓存中间件等低延迟场景建议关闭。
临时关闭
(无需重启,立即生效,重启后失效)
通用配置
(RHEL 7+/CentOS 7+/Ubuntu/Debian/SUSE 等)
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
RHEL 6 / CentOS 6 专属配置
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
验证状态
# 查看主开关状态,方括号中标注的为当前生效值
cat /sys/kernel/mm/transparent_hugepage/enabled
# 查看碎片整理开关状态
cat /sys/kernel/mm/transparent_hugepage/defrag
# 预期输出
always madvise [never]
always defer defer+madvise madvise [never]
注意:临时关闭仅对新申请的内存生效,已运行的进程需重启才能完全脱离大页。
永久关闭
GRUB 内核启动参数
(生产推荐,最彻底,必须重启生效)
内核启动时直接禁用,全局所有进程均不生效,无兼容性风险。
- 编辑配置文件
vi /etc/default/grub
- 追加内核参数
- CentOS/RHEL 系列:在
GRUB_CMDLINE_LINUX行的引号内追加GRUB_CMDLINE_LINUX="... transparent_hugepage=never" - Ubuntu/Debian 系列:在
GRUB_CMDLINE_LINUX_DEFAULT行的引号内追加GRUB_CMDLINE_LINUX_DEFAULT="... transparent_hugepage=never" - CentOS 6 / RHEL 6:直接编辑
/boot/grub/grub.conf,在 kernel 启动行末尾追加transparent_hugepage=never
- 重新生成 GRUB 配置
先确认系统启动模式:
# 有输出为 UEFI,无输出为 BIOS
ls /sys/firmware/efi
根据启动模式执行对应命令:
# 先检查对应文件存在
ll /boot/grub2/grub.cfg
ll /boot/efi/EFI/*/grub.cfg
# ====== CentOS/RHEL 系列 ======
# BIOS 传统启动
grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI 启动(CentOS)
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
# UEFI 启动(RHEL)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# ====== Ubuntu/Debian 系列 ======
update-grub
验证配置,次配置保证重启生效
grep transparent_hugepage /boot/grub2/grub.cfg grep transparent_hugepage /boot/efi/EFI/*/grub.cfg
重启验证
# reboot
1.6 内核参数
内存超量提交设置
解决 Redis 持久化 fork 失败、jemalloc 内存映射暴涨问题
# 默认 0
cat /proc/sys/vm/overcommit_memory
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
# 预期输出:1
cat /proc/sys/vm/overcommit_memory
fork 瞬间,内核层面看到的是「子进程申请了和父进程一样大的内存」,但实际上绝大多数内存是共享的,真实物理内存占用远不到两倍
vm.overcommit_memory 是控制内核超量提交策略的开关
| 取值 | 策略名称 | 核心规则 |
|---|---|---|
| 0 | 启发式超量提交(系统默认) | 内核自行判断,明显不合理的超大内存申请会拒绝,其余允许;内存紧张时也可能拒绝 |
| 1 | 永远允许超量提交 | 无论申请多少内存都直接通过,完全不做校验 |
| 2 | 严格不超量 | 申请的总虚拟内存不得超过 物理内存 * overcommit_ratio + Swap,超过直接拒绝申请 |
最大内存映射数
提升进程可拥有的内存映射上限,避免大内存实例、jemalloc 碎片化导致的分配失败
# 默认
cat /proc/sys/vm/max_map_count
echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
sysctl -p
# 预期输出:262144
cat /proc/sys/vm/max_map_count
TCP 全连接队列上限
对齐 Redis tcp-backlog 4096 配置,支撑高并发新建连接
# linux 内核5.4及之后 默认 4090
cat /proc/sys/net/core/somaxconn
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
sysctl -p
# 预期输出:4096
cat /proc/sys/net/core/somaxconn
二、源码编译安装(推荐方式)
源码安装可以让你使用最新版本,并对编译参数进行精细控制,是 生产环境推荐 的安装方式。
2.1 下载 Redis 源码
# 进入工作目录
cd /usr/local/src
# 下载 Redis 7.4.9(请根据官网最新版本调整)
# Note: Visit https://download.redis.io/releases/ for the latest version
sudo wget --no-check-certificate https://download.redis.io/releases/redis-7.4.9.tar.gz
# 解压
sudo tar xzf redis-7.4.9.tar.gz
cd redis-7.4.9
2.2 编译与安装
# 编译(-j 参数可指定并行编译线程数,加快速度)| nproc 打印当前可用的**CPU 逻辑核心数**,常用于编译时指定并发任务数(`make -j$(nproc)`)
sudo make -j$(nproc)
# 运行测试(可选,耗时较长)
# 编译完 Redis 源码后,执行全套自动化单元测试,验证编译出的 redis-server、redis-cli 等二进制程序是否正常、无内存泄漏、基础命令逻辑是否正确。
# 自动跑数百条测试用例(基于 tcl 脚本,所以之前要装`tcl`)
# 检测底层数据结构、持久化、网络、事务、集群基础功能 bug
# 输出测试结果:全部 pass 代表编译产物可用;报错则说明编译环境 / 源码有问题
sudo make test
# 默认安装到 /usr/local/bin
sudo make install
# 指定安装目录 /usr/local/redis -> /usr/local/redis/bin
sudo make PREFIX=/usr/local/redis install
# 配置 环境变量 | /etc/profile 系统级环境变量
echo "export PATH=\$PATH:/usr/local/redis/bin" >> /etc/profile source /etc/profile
安装完成后,以下可执行文件会被放到 /usr/local/bin/:
| 文件 | 说明 |
|---|---|
redis-server |
Redis 服务端 |
redis-cli |
Redis 命令行客户端 |
redis-benchmark |
性能基准测试工具 |
redis-check-aof |
AOF 文件修复工具 |
redis-check-rdb |
RDB 文件修复工具 |
redis-sentinel |
Redis Sentinel 哨兵 |
验证安装:
redis-server --version
# 输出示例:Redis server v=7.4.9 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64
redis-cli --version
# 输出示例:redis-cli 7.4.9
2.3 使用 install_server.sh(可选)
Redis 源码中自带了一个安装脚本,可以交互式完成配置:
cd /usr/local/src/redis-7.4.9
sudo ./utils/install_server.sh
该脚本会引导你设置:
- 监听端口(默认 6379)
- 配置文件路径
- 日志文件路径
- 数据目录
- 并自动注册为 systemd 服务
四、目录
手动创建目录:
# linux 系统规范
sudo mkdir -p /etc/redis /var/lib/redis /var/log/redis
sudo cp /usr/local/src/redis-7.4.9/redis.conf /etc/redis/redis.conf
sudo chown -R redis:redis /var/lib/redis /var/log/redis
# 自定义 方便统一管理
sudo mkdir -p /redis-6379/{conf,data,log}
sudo cp /usr/local/src/redis-7.4.9/redis.conf /redis-6379/conf/redis.conf
sudo cat /usr/local/src/redis-7.4.9/redis.conf | grep -v '#' | grep -v '^$' > /redis-6379/conf/redis.conf
sudo chown -R redis:redis /redis-6379
五、redis.conf 核心配置详解
Redis 的所有行为几乎都可以通过配置文件控制。以下是最重要的配置项:
5.1 网络配置
### 绑定地址 - 代表**排除不监听**
# 仅本机 IPv4,关闭 IPv6
bind 127.0.0.1 -::1
# 本机同时支持 IPv4 + IPv6
bind 127.0.0.1 ::1
# 允许所有网卡、任意 IP 外网访问(生产务必加密码)
bind 0.0.0.0 -::1
# 只监听指定本机+内网 IPv4,禁用 IPv6 (推荐)
bind 127.0.0.1 192.168.1.100 -::1
###
# 监听端口
port 6379
# 保护模式——当没有设置密码 只接受本地地址
# 3.2 ~ 6.x:没显式配 bind + 没密码 → 触发拦截
# https://github.com/redis/redis/blob/6.2/redis.conf
# 7.0+:没密码 → 触发拦截(bind 不影响)
# https://github.com/redis/redis/blob/7.4.9/redis.conf
# When protected mode is on and the default user has no password, the server
# only accepts local connections from the IPv4 address (127.0.0.1), IPv6 address
# (::1) or Unix domain sockets.
protected-mode yes
# TCP backlog 队列长度
# Accept 队列 | 配置的 **TCP 全连接队列(Accept 队列)的最大长度**,直接作用于 TCP 三次握手完成后的连接排队环节
# 取低值 ( tcp-backlog /proc/sys/net/core/somaxconn ) | 配置 echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
tcp-backlog 4096
# 空闲 5 分钟主动断开,回收长期不用的连接 | 客户端空闲超时(秒),0 表示不超时
timeout 300
# 空闲 5 分钟后启动 TCP 保活,检测异常死连接
tcp-keepalive 300
# network confg
bind 127.0.0.1 192.168.125.128 -::1
port 6379
protected-mode yes
tcp-backlog 4096
timeout 300
tcp-keepalive 300
bind 参数说明:
bind 127.0.0.1:只允许本机访问bind 0.0.0.0:允许所有网络接口访问(生产环境需配合密码和防火墙)bind 127.0.0.1 192.168.1.100:允许多个指定地址
5.2 通用配置
# 是否以守护进程方式运行
daemonize yes
# PID 文件路径
pidfile /var/run/redis/redis-server.pid
pidfile /redis-6379/redis-server.pid
# 日志级别:debug / verbose / notice / warning
loglevel notice
# 日志文件路径(空字符串表示输出到标准输出)
logfile /var/log/redis/redis.log
logfile /redis-6379/log/redis.log
# 数据库数量 默认16 表示16个库 (使用上 select 0 ~ 15,共 16 个)
# 多数据库的设计容易导致命名空间混乱,且在集群模式下不被支持。更好的做法是通过不同的Key前缀来隔离数据。
# 不支持在线(运行时)动态增加 / 修改 | 注意平衡扩展性
databases 16
# GENERAL
daemonize yes
pidfile /redis-6379/redis-server.pid
loglevel notice
logfile /redis-6379/log/redis.log
databases 16
日志级别对照:
debug:最详细,开发调试用verbose:较详细notice:生产环境推荐warning:只记录警告和错误
5.3 资源管理
# 最大内存限制(单位支持 k/m/g)
# 当内存使用达到此限制时,Redis会根据`maxmemory-policy`策略开始驱逐数据
maxmemory 256mb
# 最大客户端连接数
# 根据服务器内存和预期负载设置。每个客户端连接大约消耗10KB内存
maxclients 10000
# 内存淘汰策略
maxmemory-policy noeviction
# 关闭透明大页 |
disable-thp yes
# LRU, LFU and minimal TTL algorithms的采样数
# Redis在执行LRU等算法时,并不会检查所有key,而是随机采样一部分key进行比较。此参数设置采样数量
# 值越大,算法越精确,但CPU消耗越高
maxmemory-samples 10
# 开启后会主动调整进程的 OOM 评分,让内核优先杀其他进程,尽量保住 Redis,提升单机稳定性。
# - 0:主 Redis 实例,分值最低,内存爆满最后杀
# - 200:从库实例,内存不足优先干掉从库
# - 800:RDB/AOF 重写等 fork 出来的后台子进程,最先被杀死,保护主业务进程
oom-score-adj yes
oom-score-adj-values 0 200 800
# 删除大 key、淘汰过期 key 时会在主线程同步释放内存,key 越大阻塞越久,极端情况会导致 Redis 卡顿几秒
# Redis 4.0+ 支持后台线程惰性释放内存
# 把内存释放的重活交给后台子线程,主线程只做标记,不阻塞业务请求
# 内存淘汰时,后台异步释放内存
lazyfree-lazy-eviction yes
# key 过期删除时,后台异步释放内存
lazyfree-lazy-expire yes
# 服务端主动删除key(比如del大key),后台异步释放
lazyfree-lazy-server-del yes
# 从库全量同步完成后,异步清空旧数据
replica-lazy-flush yes
# 用户执行 DEL 命令时,默认走异步删除(等价于UNLINK)
lazyfree-lazy-user-del yes
# 用户执行 FLUSHDB/FLUSHALL 时,默认走异步清空
lazyfree-lazy-user-flush yes
# I/O多线程(Redis 6+)
# I/O多线程,可以利用多核CPU加速网络I/O。`io-threads`设置线程数,`io-threads-do-reads`决定是否对读请求也使用多线程
# Redis的核心命令处理仍然是单线程的,多线程只用于网络读写
# IO 线程数建议不超过物理 CPU 核心数的 1/2
io-threads 4
io-threads-do-reads yes
常用策略:
-
noeviction(默认):不驱逐任何数据,写请求返回错误。 -
allkeys-lru:从所有key中,使用LRU算法驱逐最近最少使用的key。 -
volatile-lru:仅从设置了过期时间的key中,使用LRU算法驱逐。 -
allkeys-random:从所有key中随机驱逐。 -
volatile-random:仅从设置了过期时间的key中随机驱逐。 -
volatile-ttl:仅从设置了过期时间的key中,优先驱逐TTL(生存时间)最短的key。 -
缓存场景:
allkeys-lru或allkeys-random。 -
带过期时间的缓存:
volatile-lru或volatile-ttl。 -
数据库场景:
noeviction,让应用层处理内存不足的情况。
# LIMITS
maxmemory 256mb
maxclients 10000
maxmemory-policy volatile-lru
disable-thp yes
maxmemory-samples 10
oom-score-adj yes
oom-score-adj-values 0 200 800
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
replica-lazy-flush yes
lazyfree-lazy-user-del yes
lazyfree-lazy-user-flush yes
io-threads 4
io-threads-do-reads yes
5.4 持久化配置
# 持久化目录 | 确保Redis用户有读写权限
dir /redis-6379/data
# RDB 快照保存规则 | 写流量很大、怕频繁 bgsave 影响性能,可以减少触发频率,比如去掉 60 秒 那条
dbfilename dump.rdb
# 在900秒内至少有1个key发生变化,或在300秒内至少有10个key发生变化,或在60秒内至少有10000个key发生变化,则触发`BGSAVE`
save 3600 1
save 300 100
save 60 10000
# RDB 持久化失败(比如磁盘满了)时,Redis 直接拒绝写入,用拒绝写入来提醒你磁盘故障
# 默认 `yes` | 宁可服务不可用,也不要产生脏数据
# 高可用场景(有从库兜底)可以改成 `no`,保证写入不中断,但要做好磁盘监控
stop-writes-on-bgsave-error yes
# RDB文件是否压缩
rdbcompression yes
# RDB文件是否校验和 | 在RDB文件末尾添加CRC64校验和,用于检测文件损坏 | 校验和的计算开销极小,但能有效保证数据完整性
rdbchecksum yes
# AOF 持久化
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF同步策略
# always:每次写操作都同步到磁盘。最安全,但性能最差
# everysec:每秒同步一次。推荐。在性能和安全性之间取得了最佳平衡,最多丢失1秒数据
# no:由操作系统决定何时同步。性能最好,但最不安全
appendfsync everysec
# AOF重写期间是否暂停 appendfsync
# AOF重写(BGREWRITEAOF)是一个磁盘I/O密集型操作。如果同时进行appendfsync,可能会导致磁盘I/O竞争,延长重写时间
# 如果磁盘I/O能力较弱,可以设置为yes,但要注意这会增加数据丢失的风险(最多可能丢失重写期间的所有数据)
no-appendfsync-on-rewrite no
# AOF自动重写触发条件
# 当AOF文件大小超过上次重写后大小的100%(即翻倍),并且文件大小至少为64MB时,触发自动重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# SNAPSHOTTING
dir /redis-6379/data
dbfilename dump.rdb
save 3600 1
save 300 100
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
5.5 安全配置
# 设置访问密码 | 默认 defualt on 使用
requirepass YourStrongPassword123!
# 禁用危险命令(重命名为空字符串即禁用)
# 完全禁用删库命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
# 重命名配置修改命令,只有知道别名的人才能改运行时配置
rename-command CONFIG "myconfig"
# 禁用调试、危险运维命令
rename-command DEBUG ""
rename-command KEYS ""
说明:KEYS 命令会遍历所有 key,大库下直接卡死 Redis,生产必须禁用,排查用 SCAN 替代。
# SECURITY
requirepass YourStrongPassword123!
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "myconfig"
rename-command DEBUG ""
rename-command KEYS ""
5.6 慢查询
# 慢查询阈值保持10ms(10000微秒),记录长度调大到1024,保留更多历史
slowlog-max-len 1024
# 开启延迟监控,超过100毫秒的事件都记录下来,排查卡顿必备,开销极低
latency-monitor-threshold 100
# SLOW
slowlog-max-len 1024
latency-monitor-threshold 100
5.7 主从复制
# 配置主从关系 | 将当前实例配置为指定主节点的从节点
# replicaof <masterip> <masterport>
# 主节点密码
masterauth your_master_password
# 主节点用户密码 ACL
masteruser <username>
masterauth <password>
# 从节点是否只读
replica-read-only yes
# 从节点是否提供过期数据 当主从断开连接或正在同步时,从节点是否继续响应客户端请求(返回可能过期的数据)
# `yes`(默认)可以保证服务可用性;`no`则更严格,但会导致服务中断
replica-serve-stale-data yes
# REPLICATION
# replicaof <masterip> <masterport>
# masteruser
# masterpass
replica-read-only yes
replica-serve-stale-data yes
5.8 集群配置
# 是否开启集群模式
cluster-enabled no
# 集群配置文件
cluster-config-file nodes-6379.conf
# 节点超时时间
cluster-node-timeout 15000
# CLUSTER
cluster-enabled no
六、启动与停止 Redis
6.1 命令行直接启动
# 注意相关文件权限
sudo chown -R redis:redis /redis-6379
# 切换redis 用户
su - redis
# 指定配置文件启动(推荐方式)
redis-server /redis-6379/conf/redis.conf
# 不指定配置文件,使用默认配置
redis-server
# 命令行覆盖配置项
redis-server /redis-6379/conf/redis.conf --port 6380 --loglevel debug
# 启动后查看日志有无报错
cat /redis-6379/log/redis.log
6.2 连接 Redis
# 默认连接 127.0.0.1:6379
redis-cli
# 指定主机和端口
redis-cli -h 127.0.0.1 -p 6379
# 带密码连接
redis-cli -a YourStrongPassword123!
# 连接后测试
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> SET hello "world"
OK
127.0.0.1:6379> GET hello
"world"
6.3 停止 Redis
# 优雅关闭(推荐)
redis-cli shutdown
# 带密码关闭
redis-cli -a YourStrongPassword123! shutdown
# 强制停止(不推荐,可能导致数据丢失)
pkill redis-server
shutdown命令会先执行 RDB 快照(如果启用了持久化),然后安全退出。
七、systemd 服务配置
daemonize yes 与 systemd 托管冲突
如果你是用 systemctl 管理 Redis 服务,daemonize 必须设为 no(前台运行)。设为 yes 时,Redis 启动后会后台 fork 脱离终端,systemd 会认为进程已退出,触发服务异常重启
7.1 创建 systemd unit 文件
sudo vim /etc/systemd/system/redis.service
写入以下内容:
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
Type=forking
PIDFile=/var/run/redis/redis-server.pid
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
Type=forking
PIDFile=/redis-6379/redis-server.pid
ExecStart=/usr/local/bin/redis-server /redis-6379/conf/redis.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
7.2 启用与管理服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动 Redis
sudo systemctl start redis
# 设置开机自启
sudo systemctl enable redis
# 查看服务状态
sudo systemctl status redis -l
# 停止服务
sudo systemctl stop redis
# 重启服务
sudo systemctl restart redis
# 查看日志
sudo journalctl -u redis -f
7.3 验证服务运行
# 检查进程
ps aux | grep redis-server
# 检查端口监听
ss -tlnp | grep 6379
# 测试连接 -a / --user --pass
redis-cli ping
八、redis-benchmark 基础使用
Redis 自带的 redis-benchmark 工具可以快速评估当前实例的性能。
8.1 基本测试
# 默认测试(100000 请求,50 并发)
redis-benchmark
8.2 自定义参数
# 指定请求数和并发数
redis-benchmark -n 50000 -c 100
# 只测试 SET 和 GET 命令
redis-benchmark -t set,get -n 100000 -c 50
# 指定 key 大小和 value 大小
redis-benchmark -t set -n 100000 -d 256
# 测试管道模式(Pipeline)
redis-benchmark -t set,get -n 100000 -P 16
# 指定主机和端口
redis-benchmark -h 127.0.0.1 -p 6379 -a YourPassword
8.3 输出解读
====== SET ======
100000 requests completed in 1.23 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.99% <= 1 milliseconds
100.00% <= 2 milliseconds
81300.81 requests per second
关键指标:
- requests per second:每秒处理请求数(QPS)
- 99.99% <= 1 milliseconds:99.99% 的请求在 1ms 内完成
九、安全基础
9.1 设置访问密码
在 redis.conf 中:
requirepass P@ssw0rd!
客户端连接时需要认证:
redis-cli
127.0.0.1:6379> SET key value
(error) NOAUTH Authentication required.
# 方式一:连接时指定密码
redis-cli -a 123456
# 方式二:连接后认证
127.0.0.1:6379> AUTH P@ssw0rd!
OK
9.2 禁用危险命令
# 完全禁用
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command KEYS ""
# 重命名为不可猜测的名字
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
⚠️
KEYS命令在大数据量时会阻塞整个 Redis 实例,生产环境建议禁用或使用SCAN替代。
9.3 网络安全最佳实践
# 1. 防火墙只允许应用服务器访问 Redis
sudo iptables -A INPUT -p tcp --dport 6379 -s 192.168.5.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP
# 2. 或使用 firewalld(CentOS/Rocky)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.0/24" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload
# 3. 禁止 Redis 使用 root 用户运行
# 在 redis.conf 中确保 daemonize yes,并创建专用用户
sudo useradd -r -s /sbin/nologin redis
9.4 安全检查清单
- 设置强密码(
requirepass) -
bind只绑定必要地址 -
protected-mode保持开启 - 禁用或重命名危险命令
- 使用非 root 用户运行 Redis
- 配置防火墙规则
- 定期更新 Redis 到最新稳定版
十、常见问题排查
10.1 端口被占用
# 查看 6379 端口占用
ss -tlnp | grep 6379
# 或
lsof -i :6379
10.2 权限问题
# 确保数据目录权限正确
sudo chown -R redis:redis /var/lib/redis
sudo chmod 750 /var/lib/redis
10.3 内存不足
# 查看 Redis 内存使用
redis-cli INFO memory
# 关键指标
# used_memory_human: 当前使用内存
# maxmemory_human: 最大可用内存
# mem_fragmentation_ratio: 内存碎片率(>1.5 需关注)
10.4 连接被拒绝
# 检查 Redis 是否运行
sudo systemctl status redis
# 检查 bind 配置
grep "^bind" /etc/redis/redis.conf
# 检查 protected-mode
grep "protected-mode" /etc/redis/redis.conf




