📌 什么是 Redis?
Redis(Remote Dictionary Server)是由 Salvatore Sanfilippo 开源的高性能键值对(Key-Value)内存数据库。它支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理空间(GEO)以及流(Stream)等丰富的数据结构。
由于数据常驻于物理内存,Redis 单节点读写性能可轻松达到 10W+ QPS。它支持 RDB 快照 与 AOF 日志 两种持久化机制,广泛应用于分布式系统中的数据高速缓存、分布式锁、会话共享、高并发计数器、排行榜及发布订阅消息系统。
🛠️ 一、Linux 系统中安装指定版本 Redis
Redis 演进迅速:
- Redis 6.x:引入多线程 I/O 模型、更细粒度的 ACL 安全权限控制、RESP3 协议。
- Redis 7.x:引入 Redis Functions(替代传统 eval Lua)、ACL 2.0、多分片 Cluster 优化与更高效的内存分配。
方法 1:使用 Redis 官方仓库安装指定版本(推荐)
1. Ubuntu / Debian 系统
# 1. 导入官方 GPG 密钥sudo apt install -y lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
# 2. 添加官方 APT 源echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
# 3. 更新并检索版本sudo apt updateapt-cache madison redis-server
# 4. 安装指定版本(例如 7.2.4)sudo apt install -y redis-server=6:7.2.4-1rl1~jammy1sudo apt-mark hold redis-server2. CentOS / RHEL / Rocky Linux 系统
# 安装 EPEL 与 Remi 源(提供最新全量 Redis 版本)sudo yum install -y epel-releasesudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# 启用指定版本模块(如 redis:7.2)sudo dnf module reset redis -ysudo dnf module enable redis:remi-7.2 -y
# 安装 Redissudo yum install -y redis方法 2:源码编译安装(任意指定精确版本)
Redis 由纯 C 语言编写且无复杂的第三方外部依赖,源码编译速度极快(通常 1 分钟内完成)。
# 1. 安装编译工具sudo apt install -y build-essential tcl # Ubuntu# sudo yum install -y gcc make tcl # CentOS
# 2. 下载指定版本源码包(以 7.2.4 为例)wget https://download.redis.io/releases/redis-7.2.4.tar.gztar -zxvf redis-7.2.4.tar.gzcd redis-7.2.4
# 3. 编译并指定安装目录make -j$(nproc)sudo make PREFIX=/usr/local/redis install
# 4. 复制配置文件sudo mkdir -p /usr/local/redis/conf /usr/local/redis/datasudo cp redis.conf /usr/local/redis/conf/配置 Systemd 服务 /etc/systemd/system/redis.service:
[Unit]Description=Redis In-Memory Data StoreAfter=network.target
[Service]User=rootExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.confExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a 'YourStrongPassword123!' shutdownRestart=always
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl start redissudo systemctl enable redis🐳 二、Linux 下使用 Docker 快速部署 Redis
1. docker run 单行命令运行
docker run -d \ --name redis-server \ -p 6379:6379 \ -v /opt/redis/data:/data \ -v /opt/redis/redis.conf:/etc/redis/redis.conf \ --restart unless-stopped \ redis:7.2-alpine \ redis-server /etc/redis/redis.conf2. docker-compose.yml 规范化编排
version: '3.8'
services: redis: image: redis:7.2-alpine container_name: redis-cache restart: always ports: - "6379:6379" volumes: - ./data:/data - ./redis.conf:/usr/local/etc/redis/redis.conf command: ["redis-server", "/usr/local/etc/redis/redis.conf"] environment: - TZ=Asia/Shanghai⚖️ 三、Docker 部署 vs 传统宿主机部署优劣对比
| 评估维度 | Docker 容器化部署 | 传统宿主机/裸机部署 (APT/源码编译) |
|---|---|---|
| 部署便利性 | ⚡ 秒级部署,结合 Alpine 镜像仅约 30MB 体积 | ⏳ 极快,源码编译仅需几十秒 |
| 内存管理与内核特性 | ⚠️ 在容器内需额外配置宿主机 overcommit_memory 与 THP(透明大页) | 🌟 原生直接生效,方便直接对 Linux 内存子系统进行内核级参数调优 |
| 网络延迟与 QPS | 经过 Docker 容器虚拟网桥会有极微小网络延迟(微秒级) | 🚀 极限零损耗,发挥物理网卡最高吞吐 |
| 数据持久化管理 | 严格依赖宿主机挂载目录(Volume),AOF 文件落地正常 | 数据存放在本地文件系统,配合外部快照备份更原生 |
NOTE选型决策建议:
- 应用缓存、会话存储、微服务架构:推荐选用 Docker Redis。
- 极限 QPS 场景(如每秒数十万并发读写的大型核心集群):推荐 宿主机原生编译部署 并优化宿主机内核参数。
⚠️ 四、新手最容易犯错的关键坑点与解决方案
💣 坑点 1:不设密码且开放 0.0.0.0 导致服务器沦为挖矿肉鸡(严重安全事故)
现象
云服务器 CPU 长期 100% 飙满,出现不明挖矿进程(如 kdevtmpfsi),~/.ssh/authorized_keys 中被写入了陌生公钥。
核心原因
很多新手在 redis.conf 中把 bind 127.0.0.1 注释掉,但没有设置 requirepass 密码。黑客通过公网 6379 端口直接使用 CONFIG SET dir /root/.ssh 和 CONFIG SET dbfilename authorized_keys 将恶意 SSH 公钥写入宿主机,直接拿到服务器 root 权限!
解决方案
CAUTION永远不要在公网运行未设密码的 Redis 实例!
- 设置强密码:在
redis.conf中配置requirepass YourComplexPassword!2026。 - 禁止 root 运行,使用非特权
redis用户。 - 禁用危险命令(生产防内鬼防提权):
redis.conf rename-command FLUSHALL ""rename-command FLUSHDB ""rename-command CONFIG "MY_SECRET_CONFIG_CMD"
💣 坑点 2:开启远程连接报 DENIED Redis is running in protected mode
现象
外部客户端连接时报错:DENIED Redis is running in protected mode because protected mode is enabled...。
核心原因
Redis 的**保护模式(protected-mode)**在未配置密码且没有绑定具体 IP 时会强制激活,拒绝任何来自非本地回环网络的请求。
解决方案
在 redis.conf 中同时完成两项配置:
# 1. 允许所有网卡监听bind 0.0.0.0
# 2. 设置访问密码requirepass YourStrongPassword123!
# 3. (可选)关闭保护模式protected-mode no💣 坑点 3:物理内存未耗尽却抛出 OOM 崩溃(vm.overcommit_memory 限制)
现象
Redis 日志中出现警告:WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.,随后在执行 BGSAVE(RDB)或 BGREWRITEAOF 时进程被系统强杀。
核心原因
执行持久化时,Redis 会调用操作系统的 fork() 创建子进程(利用 Copy-on-Write 机制)。当 Linux 系统的 vm.overcommit_memory 为 0 时,内核若评估剩余可用物理内存不足以应对最坏情况下的内存复制,就会拒绝 fork 分配。
解决方案
修改宿主机 Linux 内核参数:
# 临时生效sudo sysctl vm.overcommit_memory=1
# 永久生效echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.confsudo sysctl -p💣 坑点 4:内存写满后服务瘫痪(未配置 maxmemory 与淘汰策略)
现象
Redis 数据量暴增,内存占满后所有写入命令抛出报错:OOM command not allowed when used memory > 'maxmemory'。
核心原因
默认配置下,Redis 没有限制最大内存占用(在 64 位系统下为无限使用直到耗尽服务器全部物理内存),且默认淘汰策略为 noeviction(写满直接报错拒绝写入)。
解决方案
根据服务器实际内存规格,在 redis.conf 中明确限定最大内存与 LRU / LFU 淘汰算法:
# 设置最大可用内存(如 2GB)maxmemory 2147483648
# 配置数据淘汰策略(推荐 volatile-lru 或 allkeys-lru)maxmemory-policy allkeys-lru💣 坑点 5:THP(透明大页)导致延迟毛刺与内存膨胀
现象
Redis 读写延迟偶尔发生几十毫秒的严重抖动,日志提示:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel...。
核心原因
Linux 默认开启的 Transparent Huge Pages 在 fork 写入时分配 2MB 大页,会显著增加内存复制开销并导致慢查询。
解决方案
禁用 Linux 系统的透明大页特性:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled📋 五、生产环境通用优化配置模板(redis.conf)
# === 网络与安全 ===bind 0.0.0.0port 6379protected-mode yesrequirepass YourSuperStrongPassword!2026timeout 300tcp-keepalive 300
# === 进程与守护 ===daemonize no # Docker 容器中必须为 no;传统后台运行设为 yessupervised systemdpidfile /var/run/redis_6379.pidloglevel noticelogfile /var/log/redis/redis.log
# === 内存与淘汰策略 (以 4GB 机器为例) ===maxmemory 3221225472 # 约 3GBmaxmemory-policy allkeys-lru
# === RDB 快照持久化 ===save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesdbfilename dump.rdbdir /var/lib/redis
# === AOF 增量持久化 (高可靠性推荐启用) ===appendonly yesappendfilename "appendonly.aof"appendfsync everysec # 每秒刷盘,兼顾性能与安全no-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
# === 客户端连接与慢查询 ===maxclients 10000slowlog-log-slower-than 10000 # 超过 10 毫秒记录慢查询slowlog-max-len 1000🎯 总结速查
- 安全第一准则:
- 生产环境严禁不设密码裸奔!严禁在公网随意暴露默认 6379 端口。
- 生产上线避坑清单:
- 配置高强度
requirepass密码; - 显式配置
maxmemory上限与maxmemory-policy淘汰策略; - 在 Linux 内核开启
vm.overcommit_memory = 1; - 关闭系统 Transparent Huge Pages(THP);
- 开启 AOF
appendfsync everysec实现秒级数据防丢。
- 配置高强度
发现错误或想要改进这篇文章?
在 GitHub 上编辑此页
陕公网安备61040202000874号