☰
Ubuntu 22.04 上 Redis 安装、配置与实战:从 apt、源码到 Docker 全攻略
2026/10/26 7:30:58 网站建设 项目流程

我最近在一台 Ubuntu 22.04 服务器上完整走了一遍 Redis 的安装和使用流程,从 apt 安装、源码编译到 Docker 容器部署都试过,顺手把配置调优、redis-cli 常用命令、远程连接、可视化客户端这些日常高频操作整理成了这篇教程。如果你刚接触 Linux,或者想在 Ubuntu 上快速把 Redis 跑起来做缓存、队列、session 存储,这篇文章基本可以照着抄,也能帮你避开我踩过的一些坑。

Redis 在 Ubuntu 上的安装方式其实有好几种,网上搜出来的教程各说各话。这篇内容不打算只给你一条命令,而是把三种方式都走一遍,说清楚每种方案适用于什么场景,以及背后的取舍逻辑。这样你无论是临时搭个开发环境、给生产服务器做最小化安装,还是以后要部署主从、集群,都能心里有底。

1. 安装前准备:环境确认与方案选型

1.1 先确认 Ubuntu 版本和系统架构

动手之前,先花 30 秒看一下服务器基础信息。我见过不少人在安装中途才发现系统架构不对,或者版本太老导致软件源里根本没有 Redis 包,来回折腾半天。

# 查看系统版本 lsb_release -a # 查看系统架构 uname -m

Ubuntu 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 install

make 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 配置文件里那几个影响行为和安全的参数。我这里挑最常用的几个说明,它们也是面试常客。

配置项默认值作用
bind127.0.0.1指定 Redis 监听的网卡 IP
protected-modeyes保护模式,没有密码且未绑定内网 IP 时拒绝远程访问
port6379服务端口
daemonizeno(源码编译) / yes(apt)是否守护进程化
requirepass(空)设置访问密码
maxmemory0(不限)内存上限
maxmemory-policynoeviction内存满了之后淘汰策略
appendonlyno是否开启 AOF 持久化
save900 1 300 10 60 10000RDB 快照触发条件
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/tcp

3.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 50

4.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/LinuxRedis 官方出品,图表化监控、内存分析
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 连接远程服务器的过程不复杂,但有几个先决条件不满足就永远连不上:

  1. 服务器上 Redis 已经允许非本机访问(bind 和 protected-mode 处理好了)
  2. 防火墙和云安全组放行了 6379 端口
  3. 如果需要密码,服务器上 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 30
  • NX表示只有键不存在时才能设置成功,这保证了同一时刻只有一个客户端能拿到锁
  • 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 filelogfile 配置的目录不存在创建日志目录,或把 logfile 改为/var/log/redis/redis-server.log
连接时报NOAUTH Authentication required需要密码但没带redis-cli 加-a或配置环境变量
远程连接超时bind 限制或防火墙拦截检查 `ss -lntp
数据写入后重启丢失持久化没开启或 RDB 时间没到开启 AOF,或调低 save 阈值
系统 OOM 导致 Redis 被 killmaxmemory 太小或内存不足设置合理的 maxmemory 和淘汰策略,避免 swap

遇到启动失败问题,我建议直接前台启动看输出,这是最快定位的方式:

redis-server /etc/redis/redis.conf

配置里有错误它会直接打出来,比翻 systemd 日志直观多了。如果日志乱糟糟看不出头绪,再辅助journalctl -u redis-server --no-pager -n 100看最近 100 行。

7.2 连接超时和认证失败的排查思路

我在 Ubuntu 上装 Redis 时,第一次远程连接失败差点以为是装错了。后来发现是 bind 配置的问题。现在我的排查顺序是固定的:

  1. 先本机连:redis-cli ping,能通说明服务本身没问题,问题出在网络或访问控制
  2. 再看监听地址:ss -lntp | grep 6379,如果显示127.0.0.1:6379说明只监听了本机,需要改 bind
  3. 看 protected-mode:如果没有设置密码且 protected-mode yes,必须设置密码或明确 bind 内网 IP
  4. 检查防火墙:sudo ufw status确认 6379 放行
  5. 如果是云服务器,还要检查控制台的安全组入站规则

这套顺序走完,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确认各项指标。这套流程走顺了,后续不管是单机、主从还是集群,都能快速定位问题,希望这篇教程能帮你少走弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询