我最近在一台 Ubuntu 22.04 服务器上完整走了一遍 Redis 的安装和使用流程,从 apt 安装、源码编译到 Docker 容器部署都试过,顺手把配置调优、redis-cli 常用命令、远程连接、可视化客户端这些日常高频操作整理成了这篇教程。如果你刚接触 Linux,或者想在 Ubuntu 上快速把 Redis 跑起来做缓存、队列、session 存储,这篇文章基本可以照着抄,也能帮你避开我踩过的一些坑。
Redis 在 Ubuntu 上的安装方式其实有好几种,网上搜出来的教程各说各话。这篇内容不打算只给你一条命令,而是把三种方式都走一遍,说清楚每种方案适用于什么场景,以及背后的取舍逻辑。这样你无论是临时搭个开发环境、给生产服务器做最小化安装,还是以后要部署主从、集群,都能心里有底。
1. 安装前准备:环境确认与方案选型
1.1 先确认 Ubuntu 版本和系统架构
动手之前,先花 30 秒看一下服务器基础信息。我见过不少人在安装中途才发现系统架构不对,或者版本太老导致软件源里根本没有 Redis 包,来回折腾半天。
# 查看系统版本 lsb_release -a # 查看系统架构 uname -mUbuntu 22.04 LTS 和 24.04 LTS 是目前最常见的选择。官方软件源里已经带了 Redis,22.04 默认是 6.0.x,24.04 是 7.0.x。如果你对版本没有特殊要求,直接 apt 安装就能用;如果希望用上最新稳定版,比如 7.2 或 7.4,那更推荐走源码编译——后面我会细说。
架构方面,x86_64 是最常见的,但如果你用的是树莓派或者 ARM 云服务器,uname -m会输出aarch64。Redis 官方对这两种架构支持都很好,源码编译的时候会自动识别 CPU 架构,不需要额外操心,但后续如果使用官方 Docker 镜像,需要留意镜像标签是否匹配你的平台架构。
1.2 三条安装路线怎么选
我在不同环境里把三种安装方式都实测过,各有优劣,直接列个表对比一下:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| apt 安装 | 速度快、自动注册 systemd 服务、升级方便 | 版本通常不是最新,依赖系统源更新时间 | 开发环境、对版本不敏感的生产环境 |
| 源码编译 | 版本最新、可以指定安装路径、便于定制编译参数 | 编译耗时长、需要额外安装编译工具链 | 生产环境、需要使用最新特性的场景 |
| Docker 容器 | 环境隔离、部署快、进程级资源隔离 | 多一层网络和存储虚拟化,宿主机直接操作文件不方便 | 微服务架构、本机测试、CI/CD 环境 |
选哪种方式,核心就看一件事:你对 Redis 版本有没有硬性要求。如果只是把 Redis 当作缓存中间件,apt 装一个稳定版完全够用;如果你需要 7.0 以后才支持的 Function 功能、ACL 精细化权限管理,或者想用最新版的集群命令,那就源码编译。我自己在测试机上是 apt 安装秒级搞定,生产环境则用源码编译固定在某个稳定版本,这样升级节奏可控,出问题也知道是自己改了哪些配置导致的。
还有个细节:如果你想用 Docker 方式,我建议先确认一下本机 Docker 是否已经就绪。新装 Ubuntu 24.04 后用官方脚本装 Docker 是几分钟的事,这个场景也常见,后面第三节我会给一套 docker 命令。
2. 三种安装方式实操
2.1 使用 apt 安装 Redis
apt 安装是 Mac 党回家最快的路,不过别直接sudo apt install redis-server就完事,建议先更新一下软件源缓存,否则可能拿到旧版本索引。
sudo apt update sudo apt install -y redis-server安装完成后,Redis 会自动注册为 systemd 服务,不需要手动改配置文件就能直接启动,这个体验比源码编译好太多。
# 开机自启并立即启动 sudo systemctl enable --now redis-server # 查看运行状态 sudo systemctl status redis-server --no-pager装完可以做一次最基础的健康检查,用 redis-cli 发一个 ping:
redis-cli ping如果终端返回PONG,说明 Redis 服务已经正常工作了。注意 apt 安装的 Redis 默认只绑定 127.0.0.1,如果你只是想在本机调试,这个默认配置其实是安全且合理的;但如果之后要局域网内其他机器访问,需要手动改 bind 和 protected-mode,这个我会在配置章节详细展开。
通过 apt 安装的 Redis,相关文件路径非常有规律,后续排查问题会很省心:
| 内容 | 路径 |
|---|---|
| 主配置文件 | /etc/redis/redis.conf |
| 服务管理命令 | systemctl |
| 日志查看 | journalctl -u redis-server |
| 数据文件目录 | /var/lib/redis(默认 dump.rdb,appendonly.aof) |
2.2 源码编译安装最新稳定版
如果你需要最新版本,比如想用 Redis 7.4 的新特性,apt 仓库通常跟不上,这时候就得走源码编译。Redis 本身是 C 语言写的,编译过程很经典,没什么黑魔法,但工具链得先备齐。
# 安装编译依赖 sudo apt update sudo apt install -y build-essential pkg-config libssl-dev下载源码时我建议直接去官方下载页看一下最新稳定版,下面命令里的版本号可以替换成你需要的。
cd /usr/local/src sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz sudo tar xzf redis-7.2.4.tar.gz cd redis-7.2.4然后编译安装。这里如果你机器是 2 核以上,可以加-j$(nproc)让 make 并行编译,速度翻倍:
sudo make -j$(nproc) sudo make installmake install默认会把二进制装到的/usr/local/bin目录下,包括 redis-server、redis-cli、redis-sentinel、redis-benchmark 等几个工具。装完验证版本:
redis-server --version源码编译的默认行为是前台运行,没有注册 systemd 服务,也不会自动读取 redis.conf。所以编译安装之后还要手动准备配置文件、创建数据目录,甚至配置 systemd 服务。这也是我希望你们在选择源码安装前想清楚的原因——版本新是有代价的,后续的维护成本明显比 apt 高。
文件路径上,源码编译一般默认配置在/usr/local/etc/redis.conf,但你可以自己指定。我习惯把配置放在/etc/redis/redis.conf,和 apt 安装保持一致的路径习惯,方便记忆。
2.3 用 Docker 快速跑一个 Redis
Docker 方案是我个人最喜欢的测试方式。一条命令启动,不用污染宿主机环境,删掉重建也毫无心理负担。
docker run -d \ --name redis \ -p 6379:6379 \ -v redis_data:/data \ redis:7.2这里解释一下三个关键参数:
-p 6379:6379:把容器里的 6379 端口映射到宿主机,这样宿主机上的应用可以直接连 localhost:6379。-v redis_data:/data:使用 Docker 命名卷持久化 Redis 数据。没有这行,容器删了数据就全部丢了。redis:7.2:镜像标签。我建议显式写版本号,不要用latest,否则以后某天docker pull拉下来一个大版本升级,行为变化可能导致应用不兼容。
启动后验证:
docker exec -it redis redis-cli ping容器方式跑 Redis 最大的便利在于:你不用关心宿主机装的是什么版本、把配置文件放哪里了,一切收敛到镜像里。生产上如果用 docker-compose 起一套主从,也只需要复制粘贴几个 service 配置,省时省力。要注意的是 Docker 网络模式默认是 bridge,宿主机其他容器访问 Redis 时,应该使用服务名或容器名,而不是 localhost。
3. 核心配置与安全加固
3.1 redis.conf 关键参数解读
不管用哪种方式安装,最终都要关心 Redis 配置文件里那几个影响行为和安全的参数。我这里挑最常用的几个说明,它们也是面试常客。
| 配置项 | 默认值 | 作用 |
|---|---|---|
| bind | 127.0.0.1 | 指定 Redis 监听的网卡 IP |
| protected-mode | yes | 保护模式,没有密码且未绑定内网 IP 时拒绝远程访问 |
| port | 6379 | 服务端口 |
| daemonize | no(源码编译) / yes(apt) | 是否守护进程化 |
| requirepass | (空) | 设置访问密码 |
| maxmemory | 0(不限) | 内存上限 |
| maxmemory-policy | noeviction | 内存满了之后淘汰策略 |
| appendonly | no | 是否开启 AOF 持久化 |
| save | 900 1 300 10 60 10000 | RDB 快照触发条件 |
| dir | /var/lib/redis | 持久化文件存放位置 |
daemonize这个参数在调试的时候容易坑人。apt 安装方式下 systemd 管理服务时,Redis 会以非 daemon 方式跑在前台,由 systemd 接管;如果你手动改配置想把它跑成后台进程,可能会和 systemd 冲突。源码编译安装时,默认是前台运行,终端一关进程就没了,需要手动把daemonize yes改上,或者注册成 systemd 服务。
3.2 密码、网络访问控制和安全策略
网上很多教程教你直接把protected-mode改成 no,然后重启完事。我不建议这么做。protected-mode yes是 Redis 非常关键的一道安全防线,在没设置密码的情况下,它会把外部 IP 的连接直接拒绝。正确的姿势是:如果你需要远程访问,就不要关闭保护模式,而是设置密码,再把 bind 改成对外网卡 IP 或0.0.0.0。
修改配置文件中的两处:
# redis.conf bind 0.0.0.0 requirepass your-strong-password然后重启服务:
sudo systemctl restart redis-server重启之后,命令行连接就需要带密码了:
redis-cli -a your-strong-password不过要提醒一句,-a方式直接明文传密码,进程列表里会被人看到。更稳妥的做法是用环境变量:
REDISCLI_AUTH=your-strong-password redis-cli在多人共用的机器上,明文-a的密码会出现在 shell history 里。自己用没关系,公司环境还是建议用环境变量方式,或者干脆不要用 redis-cli 远程连,客户端工具本身就支持密码输入的。
防火墙层面也要注意,如果你改了 bind,还要确认 Ubuntu 自带的 ufw 开了 6379 端口,云服务器的话安全组也要放行。
sudo ufw allow 6379/tcp3.3 持久化策略:RDB 和 AOF 怎么选
Redis 持久化是缓存场景里最容易被忽略的一环。默认配置下 Redis 会定期生成 RDB 快照,但如果你缓存的数据可以随时重建,RDB 已经够用;如果数据不能丢,必须开 AOF 或者混合持久化。
RDB 快照适合当"笔记本",每隔一段时间记录一下当前状态,恢复速度快,但最近一次快照之后的新写入会丢失。AOF 就像"录音笔",每条写命令都会追加到文件里,数据安全性高,但文件体积会越来越大,恢复速度也慢一些。Redis 4.0 之后的混合持久化模式,先用 RDB 打底,再把增量的写命令以 AOF 格式追加,兼顾恢复速度和数据安全,这个模式生产环境用得多。
# redis.conf appendonly yes appendfsync everysec aof-use-rdb-preamble yes我个人的建议是:如果只是缓存,Redis 挂了可以从数据库重新加载,那 RDB 完全够;如果 Redis 里有订单、会话这种不能丢的数据,请毫不犹豫开 AOF,并把appendfsync设为everysec——每秒同步一次,性能和安全性的折中方案,也是官方推荐的默认策略。测试环境或者对数据不敏感的话,可以直接不开启 AOF,省一点磁盘 IO。
4. 上手使用:常用命令与数据类型
4.1 redis-cli 基础操作
Redis 安装好之后,你打交道最多的就是 redis-cli 这个命令行工具。除了刚才的 ping,日常用的命令就是会话级别的增删改查。
# 写入键值 redis-cli SET username zhangsan # 读取键值 redis-cli GET username # 设置带过期时间的键,单位是秒 redis-cli SET session_token abc123 EX 3600 # 查看一个键的剩余生命周期 redis-cli TTL session_token # 删除键 redis-cli DEL username # 查看所有键 redis-cli KEYS '*'这里我要强调一个新手容易犯的错:生产环境千万不要用KEYS '*'查所有键。Redis 是单线程模型,KEYS会全量扫描所有键,如果库里有几十万、上百万个键,这个命令会直接阻塞服务,导致线上事故。需要匹配键列表时用SCAN命令,它是游标式的增量遍历,每次返回少量数据,不会阻塞。
# 增量遍历所有键 redis-cli SCAN 0 MATCH user:* COUNT 100除了基础命令,redis-cli 还自带一个性能测试工具 redis-benchmark,可以用来快速评估当前机器的 Redis 性能基线。
redis-benchmark -n 100000 -c 504.2 五种数据类型的应用场景
Redis 能成为通用缓存中间件,很大程度是因为它的数据类型丰富。很多小项目其实只用到了 String,这是对 Redis 能力的浪费。下面五类数据类型和对应的真实场景,面试和开发都用得上:
| 类型 | 数据结构 | 典型场景 |
|---|---|---|
| String | 字符串 | 缓存页面片段、计数器、分布式锁 |
| List | 双向链表 | 消息队列、最新动态列表、简单任务队列 |
| Hash | 字典 | 存储用户信息、对象缓存、购物车 |
| Set | 无序集合 | 去重、共同好友、点赞列表 |
| ZSet | 有序集合 | 排行榜、延时队列、限流窗口 |
举一个比较直观的案例。用户信息如果塞成 String,通常得用 JSON 序列化后整体存,改一个字段就得反序列化整个对象再写回去。但用 Hash 的话可以一个字段一个字段操作:
redis-cli HSET user:1001 name "张三" age 18 city "上海" redis-cli HGET user:1001 age再比如排行榜,用 ZSet 一句话就能搞定:
redis-cli ZADD leaderboard 1000 "player1" redis-cli ZADD leaderboard 1500 "player2" redis-cli ZREVRANGE leaderboard 0 9 WITHSCORES这就是为什么我说不要只会 String。编程语言里的字典结构在 Redis 里都有对应物,用对了类型,代码简洁、性能也高。
5. 连接与管理:可视化客户端实战
5.1 三款常用客户端对比
命令行敲多了,有时候还是想看一眼图形界面上的数据长什么样,尤其是排查问题时,一个带 GUI 的客户端能省不少时间。我用过的三款里,各有长处:
| 客户端 | 是否开源 | 跨平台 | 核心优势 |
|---|---|---|---|
| Redis Insight | 否(官方免费) | Windows/macOS/Linux | Redis 官方出品,图表化监控、内存分析 |
| Redis Desktop Manager | 老牌,新版本闭源 | Windows/macOS/Linux | 兼容性好,社区版本较旧 |
| Another Redis Desktop Manager | 开源免费 | Windows/macOS/Linux | 界面轻量、功能覆盖广,更新活跃 |
我个人推荐 Redis Insight。它的连接管理、键值浏览、内存分析做得都比较完善,关键是有个图形化的命令日志和性能指标面板,对于日常排查来说非常直观。不过它内存占用有点高,如果你的本机配置比较低,Another Redis Desktop Manager 会更轻快。
5.2 用 Redis Insight 连接服务器
Redis Insight 连接远程服务器的过程不复杂,但有几个先决条件不满足就永远连不上:
- 服务器上 Redis 已经允许非本机访问(bind 和 protected-mode 处理好了)
- 防火墙和云安全组放行了 6379 端口
- 如果需要密码,服务器上 requirepass 已经设置
打开 Redis Insight,新建连接,填写几个关键项:
- Host:服务器公网 IP 或内网 IP
- Port:6379(除非你改了)
- Password:你设置的 requirepass 密码
- Database Alias:给这个连接起个名字,比如
test-server-redis
填好之后测试连接,显示绿色的 Connected 就成功了。
这里有个坑:如果你改了 Redis 的默认端口,客户端连接时要填对端口,很多人在“为什么我 Redis 在服务器上明明能跑,但客户端连不上”这个问题上栽跟头,基本都是端口、bind 地址或密码这三件事没对齐。分步骤排查就好,别上来就怀疑 Redis 坏了。
6. 进阶用法:主从复制、持久化与常见运维场景
6.1 一主一从,五分钟快速配置
Redis 服务跑起来之后,下一个自然的需求就是高可用。主从复制是 Redis 集群的基础,也是很多面试题的高频考点。配置主从其实非常简单,假设你已经有一台主节点(192.168.1.10),再准备一台从节点(192.168.1.11)。
在从节点的 redis.conf 里加一行:
replicaof 192.168.1.10 6379如果主节点设置了密码,从节点还要配:
masterauth your-password重启从节点服务:
sudo systemctl restart redis-server然后可以通过INFO replication查看复制状态:
redis-cli INFO replication如果看到主节点输出connected_slaves:1,从节点输出master_link_status:up,说明主从同步已经建立。主从复制的好处:一是数据有了备份;二是可以把读请求分流到从节点,降低主节点压力。注意一点:默认情况下从节点是只读的,写入从节点会报错,这是正常行为,别慌。
6.2 分布式锁和缓存治理
关于 Redis 分布式锁,很多项目里都会用到。最简单的实现其实就是 SET 命令带 NX 和 EX 参数:
redis-cli SET lock:order 1 NX EX 30NX表示只有键不存在时才能设置成功,这保证了同一时刻只有一个客户端能拿到锁EX 30表示锁 30 秒后自动释放,避免客户端宕机导致死锁
释放锁的时候要小心,不能用简单的DEL,因为你可能把别人新拿到的锁删掉。正确做法是用 Lua 脚本先比对 value 再删除,保证删除的是自己持有的一把锁。这个细节也是分布式锁高频面试点,面试官就爱看你有没有意识到“误删别人锁”的问题。
缓存治理那一块,俗称“缓存三兄弟”:穿透、击穿、雪崩。
- 缓存穿透:查询一个不存在的 key,请求直接打到数据库。应对方案:对空结果也做短期缓存,或者在前面加布隆过滤器。
- 缓存击穿:热点 key 过期瞬间,大量请求打崩数据库。方案:热点 key 不过期,或者加互斥锁重建缓存。
- 缓存雪崩:大量 key 在同一时刻失效。方案:过期时间加随机值,错开集中淘汰时间。
这些在面试题中出现频次极高,开发时也容易踩。在一个真实的缓存治理项目里,我通常会给热 key 的 TTL 加随机数缓冲,比如本来要设 1 小时,实际写成 3600 + random(0, 300),防止同一秒内集体过期。小改动,却在高峰期能避免不少问题。
7. 常见问题排查与避坑记录
7.1 启动失败类问题速查
我把实际运维和开发中遇到的典型问题列个表,对照排查比看长篇日志高效得多:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| systemctl 启动后立刻退出,状态是 failed | 配置语法错误 | 用redis-server /etc/redis/redis.conf前台运行,看报错信息 |
redis-server 提示Can't open the log file | logfile 配置的目录不存在 | 创建日志目录,或把 logfile 改为/var/log/redis/redis-server.log |
连接时报NOAUTH Authentication required | 需要密码但没带 | redis-cli 加-a或配置环境变量 |
| 远程连接超时 | bind 限制或防火墙拦截 | 检查 `ss -lntp |
| 数据写入后重启丢失 | 持久化没开启或 RDB 时间没到 | 开启 AOF,或调低 save 阈值 |
| 系统 OOM 导致 Redis 被 kill | maxmemory 太小或内存不足 | 设置合理的 maxmemory 和淘汰策略,避免 swap |
遇到启动失败问题,我建议直接前台启动看输出,这是最快定位的方式:
redis-server /etc/redis/redis.conf配置里有错误它会直接打出来,比翻 systemd 日志直观多了。如果日志乱糟糟看不出头绪,再辅助journalctl -u redis-server --no-pager -n 100看最近 100 行。
7.2 连接超时和认证失败的排查思路
我在 Ubuntu 上装 Redis 时,第一次远程连接失败差点以为是装错了。后来发现是 bind 配置的问题。现在我的排查顺序是固定的:
- 先本机连:
redis-cli ping,能通说明服务本身没问题,问题出在网络或访问控制 - 再看监听地址:
ss -lntp | grep 6379,如果显示127.0.0.1:6379说明只监听了本机,需要改 bind - 看 protected-mode:如果没有设置密码且 protected-mode yes,必须设置密码或明确 bind 内网 IP
- 检查防火墙:
sudo ufw status确认 6379 放行 - 如果是云服务器,还要检查控制台的安全组入站规则
这套顺序走完,99% 的连接问题都能定位到。
7.3 性能与内存问题
Redis 是内存数据库,内存管理是终身课题。我遇到过内存只增不减、甚至最终被 OOM 击杀的情况,排查下来的经验是:先看INFO memory,确认 used_memory 和 maxmemory 之间的关系,再用redis-cli --bigkeys找出占用最大的 key,针对性地做容量规划。
慢查询也是必须关注的点。可以先查看当前慢查询日志:
redis-cli SLOWLOG GET 10如果发现有耗时超过 100ms 的命令,大概率是KEYS *或某个 O(N) 的复杂操作导致,需要确认业务代码是否有不合理的 Redis 操作。把慢查询阈值调低一些,比如 5 毫秒,可以更早暴露问题:
redis-cli CONFIG SET slowlog-log-slower-than 5000不过注意,CONFIG SET是临时生效,重启后会丢失,想长期保留还是要写进配置文件。
在内存资源不足的机器上,我建议设置 maxmemory 和 maxmemory-policy。生产环境比较常用的淘汰策略有两种:allkeys-lru(所有键都参与 LRU 淘汰)适合缓存场景;volatile-lru(只淘汰有过期时间的键)适合想保留常驻数据的场景。具体选哪个要结合业务判断,没有银弹。这里提醒一句:千万不要把noeviction用在生产缓存上,否则内存满了之后写命令直接报错,可能引起业务异常。
我在实际配置中,通常这样设置:
# redis.conf maxmemory 2gb maxmemory-policy allkeys-lru当然,这只是服务器内存 4GB 时的保守做法。你要根据机器物理内存和业务量合理调整阈值,留出操作系统和其他进程的余量,别把 Redis 内存上限顶满到物理内存边缘,那样一旦有瞬间流量,很容易触发系统 OOM。
写在最后的一点经验
在 Ubuntu 上把 Redis 装起来、用起来,其实没有太多玄学,核心就是把安装方式选对、配置文件吃透、常见问题排查路径理顺。我个人的体感是:刚开始踩坑最多的不是 Redis 本身,而是 Linux 系统的权限、防火墙、systemd 管理方式这些环境因素。所以如果你卡在某个环节,建议先跳出去检查系统层面,很多问题并不是 Redis 的错。
最后分享一个小习惯:每次改完配置,先手动redis-server /path/to/redis.conf --test-memory做一次快速自检,然后重启服务,再用redis-cli ping验证,最后用INFO memory、INFO replication确认各项指标。这套流程走顺了,后续不管是单机、主从还是集群,都能快速定位问题,希望这篇教程能帮你少走弯路。