在近几年的后端项目里,Redis几乎成了标配组件。它通常被归类为缓存中间件,但真用起来会发现,它的能力远不止“缓存”两个字:排行榜、登录态存储、接口限流、分布式锁、轻量消息队列,甚至部分数据的持久化存储,都能由它承接。这篇文章要把 Redis 的概述与安装配置讲透,从版本选择开始,到不同平台的部署方式,再到核心配置文件 redis.conf 的实际调整,最后聊聊连接验证和线上故障排查。内容适合两种人:一是刚接触 Redis、想快速搭建开发环境的同学,二是需要在自己的服务器或公司测试环境里规范部署 Redis、避免一上线就踩坑的开发者。我会把命令背后的原因也补上,不只是让你复制粘贴。
1. 先说清楚 Redis:它到底是什么、能做什么
1.1 它不只是缓存中间件
先给一个相对准确的定义:Redis 是一个基于内存的键值数据库(in-memory data structure store),支持 String、Hash、List、Set、ZSet 等多种数据结构。很多项目把它放在 MySQL 前面当缓存,理由很简单:内存读写速度快,能抗住高并发读请求,给数据库省去大量压力。但如果你真的只把它当成缓存,就有点浪费了。
我见过很多项目用 Redis 做这些事,效果都很好:
- 用户登录态:用 String 或 Hash 存 session/token,设置过期时间,天然支持自动失效。
- 热点数据缓存:商品详情、用户信息、配置信息,谁查谁缓存。
- 计数器:比如阅读数、点赞数,用 INCR 系列命令,一个请求就完成自增。
- 排行榜:用 ZSet 按分数排序,直接取 Top N。
- 分布式锁:多个服务实例抢锁时,用 SETNX 加 Lua 脚本保证原子性。
- 轻量消息队列:用 List 的 LPUSH/BRPOP 或 Stream 做简单的异步任务处理。
这些场景都是在一台 Redis 上通过不同数据结构实现的。所以说,Redis 的安装配置绝非“跑起来就行”,你搭的环境越规范,后面做业务时能省的时间就越多。
1.2 五种基础数据结构,先背熟场景
面试题里经常考“Redis 有哪些数据类型”,实际开发中更重要的反而是“这个场景应该用哪种类型”。我习惯这样记:
| 类型 | 典型使用场景 | 常用命令示例 |
|---|---|---|
| String | 缓存、计数器、分布式锁、session | SET, GET, INCR, SETNX, EXPIRE |
| Hash | 对象信息、购物车、用户资料 | HSET, HGET, HGETALL |
| List | 消息队列、时间线、最新列表 | LPUSH, RPOP, BRPOP, LRANGE |
| Set | 去重、共同好友、标签系统 | SADD, SMEMBERS, SINTER |
| ZSet | 排行榜、延迟队列、优先级任务 | ZADD, ZRANGE, ZREVRANGE, ZSCORE |
使用场景可以这样理解:如果你要存“一个用户的所有字段”,用 Hash 比用一个 JSON 字符串更灵活;如果你要做“最新 100 条消息”,List 的 LRANGE 很顺手;如果你要做“按分数排序的榜单”,ZSet 基本就是为你准备的。
1.3 单线程却很快,别被“线程数”带偏
Redis 的命令执行是单线程的,很多人第一反应是“单线程那岂不是浪费多核 CPU”?其实 Redis 的核心瓶颈几乎从来不在 CPU,而在内存和网络 I/O。单线程模型带来的好处很实际:没有线程切换的额外开销,没有各种锁竞争问题,命令之间天然串行,实现和调试都简单。
它之所以快,主要靠三点:
- 数据全在内存里,读写走内存而不是磁盘。
- 使用 I/O 多路复用,一个线程就能处理大量客户端连接,类似餐厅里一个服务员同时接待多桌客人。
- 命令本身设计得短小高效,时间和空间复杂度都可控。
当然,Redis 6.0 之后引入了多线程 I/O,用来分担网络读写压力,但核心命令执行阶段仍然是单线程。所以你在配置时不必纠结“要不要把 Redis 线程数调高”,重点应放在内存上限、持久化策略、慢查询监控上。后面的配置章节我会展开讲。
1.4 持久化与高可用:安装配置后面的分支
聊安装配置前,还得提两个概念:持久化和高可用。Redis 是内存数据库,如果只靠内存,进程一挂数据就全丢了。所以它提供了 RDB(快照)和 AOF(追加日志)两种持久化方式,这就是为什么安装时一定要规划好数据目录和日志目录。
高可用方面,Redis 有主从复制、哨兵(Sentinel)、集群(Cluster)三套机制。主从复制是数据冗余的基础,哨兵负责自动故障切换,集群则解决单节点容量和写入压力的问题。很多安装教程只教你怎么把 Redis 启动,但生产环境里,你还需要考虑是否需要主从、是否需要 Docker 化、是否要接可视化工具。这些我会在第 3 章和第 4 章一起覆盖。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动工之前:版本、部署方式和几个大坑
2.1 Redis 版本怎么选
选版本这件事,看起来简单,实际上很多人踩过坑。我的建议是:
- 新项目直接用 7.x 系列,比如 7.2.5 或更新的稳定版本。7.0 开始支持 Redis Functions、ACL 权限控制改进、集群兼容性提升,比 6.x 好用不少。
- 老项目如果已经跑在 5.x/6.x 上,不要为了“升级”而升级,除非你确认所有数据结构命令和客户端库都兼容。Redis 的升级一般比较平滑,但生产环境要不要升,得看变更评估。
- 别碰 alpha、beta、RC 版本,除非你在做专项测试。稳定版可以在官网的 download 页面看到,推荐选择 latest stable 对应的小版本。
还有个容易混淆的点:Windows 下的 Redis 版本和 Linux 下的官方版本不是一回事。官方并不提供原生 Windows 安装包,但 Windows 用户可以通过 WSL2、Docker Desktop,或者使用第三方移植版来运行。第 3 章会详细给方案,这里先记住:能用 Linux 就用 Linux,能容器化就容器化。
2.2 部署方案对比:本机、Docker、云服务
不同场景下,Redis 的部署方式差别挺大。我整理了一张对比表:
| 部署方式 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| Linux 二进制/源码安装 | 可控性强、链路清晰、适合生产规范 | 需要手动管理配置、日志、systemd | 服务器/生产环境 |
| 包管理器(apt/yum/brew) | 安装快、便于维护 | 版本可能偏旧,需要额外配置仓库 | 开发测试环境 |
| Docker 容器 | 环境隔离、部署快、易扩展 | 要理解卷挂载、网络模式、容器生命周期 | 本地开发、微服务、CI/CD |
| 云厂商托管 Redis | 免运维、自动备份、监控完善 | 费用高,部分内核参数不可定制 | 成熟业务、企业生产 |
如果图省事,本地开发直接用包管理器或 Docker 都行;但如果你想在生产环境严谨一点,我更推荐源码安装配合 systemd 托管,或者用 Docker Compose 把 Redis 编排进整个服务栈。后面我会演示实际命令。
2.3 下载渠道与安全检查
官方下载地址是 download.redis.io,Linux 源码包建议从官网或官方 GitHub releases 拿。Windows 的第三方移植版我常用的是 tporadowski/redis,它提供基于 Redis 5.x/6.x 的 Windows 二进制版本,适合本地学习,但别指望它在生产环境能像 Linux 一样稳定。
无论从哪下载,建议你做两件事:
- 校验下载文件的哈希值,跟官网/github 上公布的值对比一下。
- 安装后立刻设置密码并确认网络绑定关系,避免 Redis 裸奔在公网。这个不用过度紧张,但安全习惯要从第一次安装就开始养成。
3. 实操:二进制、包管理、Windows 与 Docker 四种装法
3.1 Linux 源码编译安装:最稳的方式
服务器上如果对版本有强约束,或者你想完全掌握编译参数,源码编译是最稳的。先装依赖:
bash复制sudo apt-get update
sudo apt-get install -y build-essential tcl
然后下载、解压、编译。以 CentOS/Ubuntu 通用为例:
bash复制wget https://download.redis.io/releases/redis-7.2.5.tar.gz
tar -xzf redis-7.2.5.tar.gz
cd redis-7.2.5
make -j4
sudo make install
make 执行完如果没报错,redis-server 和 redis-cli 就会被装到 /usr/local/bin 下。你可以先验证一下:
bash复制redis-server --version
运行效果类似:Redis server v=7.2.5 sha=... malloc=jemalloc bits=64 build=...。看到版本号就说明编译成功。想跑冒烟测试,可以执行 make test,不过这一步耗时较长,赶时间可跳过。
启动服务前最好建一个配置目录和用户。生产环境我一般会创建一个 redis 用户,然后把 /etc/redis 和 /var/lib/redis 的权限分清楚:
bash复制sudo mkdir -p /etc/redis /var/lib/redis /var/log/redis
sudo useradd --system --home-dir /var/lib/redis redis
sudo chown -R redis:redis /var/lib/redis /var/log/redis
源码包里的 redis.conf 在解压目录中,复制到 /etc/redis 下再改:
bash复制sudo cp redis.conf /etc/redis/redis.conf
改配置前先备份原文件是好习惯:sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak。接下来用 redis-server 指向配置启动:
bash复制redis-server /etc/redis/redis.conf
3.2 包管理器安装:apt/yum/brew 省心版
如果你只是想在本地实验,包管理器最省心。Ubuntu/Debian:
bash复制sudo apt-get update
sudo apt-get install -y redis-server
sudo systemctl enable --now redis-server
redis-cli ping
# 应输出 PONG
CentOS/RHEL 的默认仓库里 Redis 版本可能老,建议先安装 EPEL 或者 Remi 仓库,再执行 sudo yum install -y redis。装好后同样可以用 systemctl start redis 控制。
macOS 用户直接走 Homebrew:
bash复制brew install redis
brew services start redis
redis-cli ping
使用包管理器安装最大的好处是:系统帮你处理好了服务托管、开机自启、默认目录等琐事。但要注意,不同发行版对配置文件的默认路径和目录归属有差异。Ubuntu 上默认配置文件在 /etc/redis/redis.conf,数据目录在 /var/lib/redis,日志在 /var/log/redis/redis-server.log。你别凭记忆乱找,先 redis-cli info server 或者 systemctl status redis-server 看一下实际路径。
3.3 Windows 环境安装:WSL2 和第三方移植版
Windows 玩家装 Redis 最容易卡壳。其实最好的路线是 WSL2,绕开官方不支持 Windows 的尴尬。先装 WSL2 和 Ubuntu:
bash复制wsl --install -d Ubuntu
装完进入 Ubuntu 终端,然后:
bash复制sudo apt-get update
sudo apt-get install -y redis-server
sudo service redis-server start
redis-cli ping
这样你在 Windows 上等于操作一台真实的 Linux,后面写配置文件、测试命令都和服务器完全一致。如果你的项目代码跑在 Windows 上,想直接通过 127.0.0.1:6379 访问 WSL 里的 Redis,需要留意 WSL2 的地址映射,一般默认用 localhost 是可以的。
如果你不想用 WSL,可以下载 tporadowski/redis 的 Windows 版 zip 包,解压后打开目录里的 redis-server.exe 就能启动,redis-cli.exe 就是客户端。注意这类移植版通常停留在 5.x/6.x,且没有官方支持。我建议把第三方版只当作本地学习工具,注册成 Windows 服务或者在生产环境跑它都不太靠谱。
3.4 Docker 安装 Redis:推荐给大多数人
Docker 是绕开“环境差异”的最短路径,尤其适合本地开发和微服务环境。拉镜像并启动:
bash复制docker pull redis:7.2.5
docker run -d --name redis -p 6379:6379 redis:7.2.5
然后验证:
bash复制docker exec -it redis redis-cli ping
这个跑法适合快速体验,但有一个坑:镜像默认不带持久化数据卷,容器一删数据就没了。所以正经使用时,我建议挂载配置文件和持久化目录:
bash复制mkdir -p /data/redis/conf /data/redis/data
docker run -d --name redis \
-p 6379:6379 \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
redis:7.2.5 redis-server /etc/redis/redis.conf
如果你想在 Docker 里做一主一从实验,可以起两个容器,从节点在配置里添加 replicaof <master-ip> 6379,或者用命令参数指定。例如:
bash复制docker run -d --name redis-slave -p 6380:6379 redis:7.2.5 \
redis-server --replicaof <master-ip> 6379
注意用 Docker 时,redis.conf 里的 bind 127.0.0.1 会导致容器外部无法访问,通常需要改成 bind 0.0.0.0 或直接注释 bind,然后靠 Docker 的端口映射来暴露。这就涉及到下一章要讲的配置内容了。
4. redis.conf 看完这几项,配置才算入门
4.1 网络与安全配置
配置文件是 Redis 的灵魂。官方注释很全,但太长,我先挑几条最重要的讲。
conf复制bind 127.0.0.1
protected-mode yes
port 6379
requirepass your_strong_password
- bind:默认是 127.0.0.1,表示只有本机能连。如果想让局域网或容器外部访问,需要改为
bind 0.0.0.0,但这么做等于把你的 Redis 暴露到所有网卡上,非常危险。更稳妥的做法是只 bind 内网 IP,比如bind 192.168.1.10。 - protected-mode:默认 yes。当 Redis 没有设置密码、也没有显式绑定外部地址时,拒绝远程连接。如果你设了密码且明确 bind 了网段,这个保护会自动放宽。
- requirepass:设置访问密码。生产环境必须设置,不要偷懒。设置后,命令行连接时需要
redis-cli -a 密码,或者在进入交互模式后执行AUTH 密码。 - port:默认 6379。除非要跑多个 Redis 实例,一般不修改。
之前有个朋友把 Redis 装在云服务器上,bind 设为 0.0.0.0,又没有设密码,结果第二天就被挖矿程序植入恶意脚本,CPU 被拉满。这不是危言耸听,Redis 暴露在公网且无密码,基本等于把数据写在地上。所以网络和安全相关的配置,我建议你一次就配好。
4.2 内存管理与淘汰策略
内存是 Redis 最贵的资源。如果不设上限,Redis 会无限吃系统内存,直到触发 OOM。生产环境我基本都会配:
conf复制maxmemory 256mb
maxmemory-policy allkeys-lru
- maxmemory:Redis 可用的最大内存。单位可以用 kb、mb、gb。
- maxmemory-policy:当内存达到上限后,Redis 如何处理新写入。常用策略有:
| 策略 | 行为 | 适用场景 |
|---|---|---|
| noeviction | 不淘汰,写入直接报错 | 数据绝对不能丢的场景 |
| allkeys-lru | 从所有 key 里按最近最少使用淘汰 | 纯缓存场景,推荐 |
| volatile-lru | 从设置了过期时间的 key 里淘汰 | 既有缓存又有不可丢数据的混合场景 |
| allkeys-lfu | 按访问频率淘汰 | 热点数据访问频率差异明显的场景 |
| volatile-ttl | 淘汰剩余过期时间最短的 key | 类似过期优先清理 |
怎么选?如果你的 Redis 就是给 MySQL 挡查询压力,数据丢了可以从数据库重建,直接 allkeys-lru 最省事。如果里面存了相对重要的业务数据,宁可写入报错也不要丢,那就用 noeviction,然后另外做监控。
设置完可以在运行时通过 CONFIG GET maxmemory 查看,也可以临时用 CONFIG SET maxmemory 512mb 调整,但注意 CONFIG SET 不会永久保存,重启后失效。需要写进 redis.conf 才持久。
4.3 持久化配置:RDB 和 AOF
Redis 持久化有两条路,经常有人搞混。
RDB 是快照方式,按时间点把内存数据存成二进制文件。默认配置长这样:
conf复制save 900 1
save 300 10
save 60 10000
意思是:900 秒内有 1 次写入就保存一次快照,300 秒内有 10 次写入就保存,60 秒内有 10000 次写入就保存。RDB 文件小、恢复快,但崩溃时可能丢失最后一次快照之后的数据。
AOF 是追加日志方式,把每次写命令都记录到日志文件,重启时重放日志恢复数据。配置:
conf复制appendonly yes
appendfsync everysec
appendfsync 有三个选项:always 每次写入都刷盘,最安全但性能最差;everysec 每秒刷一次,性能和可靠性折中,生产环境默认推荐;no 交给操作系统刷盘,性能最好但丢数据风险最大。
我的建议很简单:缓存场景可以只开 RDB 或者干脆不开持久化,等数据全丢了从上游重建;业务数据场景必须开 AOF,并且把 appendfsync 设为 everysec。更强一点的方案是“混合持久化”,Redis 4.0 之后可以用 aof-use-rdb-preamble yes,AOF 文件开头先用 RDB 快照,之后追加增量日志,兼顾恢复速度和文件大小。
4.4 日志、后台运行与 systemd 托管
Redis 默认在前台运行,日志打到 stdout。这样终端一关,服务就没了。可以这样配置:
conf复制daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis-server.log
loglevel notice
- daemonize yes:让 Redis 后台运行。
- pidfile:保存进程号,便于停止和管理。
- logfile:日志文件路径。注意目录必须存在,否则 Redis 可能启动失败。
- loglevel:日志级别,开发阶段可调 notice,线上一般也要 notice,debug 日志量大且影响性能。
更推荐的做法是交由 systemd 管理,这样支持开机自启、崩溃自动重启。源码编译安装后,可以手动创建 /etc/systemd/system/redis.service:
text复制[Unit]
Description=Redis Server
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
PIDFile=/var/run/redis_6379.pid
[Install]
WantedBy=multi-user.target
然后:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now redis
sudo systemctl status redis
这里有个细节:如果你的配置文件里设置了 daemonize yes,而 systemd 又直接托管并检测进程,可能会出现“服务 start 后立刻退出”的错觉。所以我通常会在 systemd 托管时把 daemonize 改为 no,让 Redis 在前台运行,由 systemd 负责后台化。这两种方式没有绝对对错,但混着用很容易让人误解日志和服务状态。
5. 连上 Redis:验证、客户端工具与连接失败排查
5.1 redis-cli 命令行验证
安装完成、服务启动后,第一件事就是确认能正常连上。命令行是最直接的验证手段:
bash复制redis-cli -h 127.0.0.1 -p 6379 -a your_strong_password ping
# 输出 PONG
如果你不想在命令行里透传密码,可以先进交互模式再执行 auth your_strong_password。注意 -a 方式会在 shell 历史记录里留下密码,生产环境最好别这么干。
然后试着写几个 key 验证功能:
bash复制redis-cli
> auth your_strong_password
> set hello world
> get hello
> incr counter
> expire hello 60
> ttl hello
看到“world”和递增后的数字,就说明读写都正常。再执行 info 可以看内存、连接数、持久化等详细信息,这是后面排查问题的重要入口。
5.2 用 Redis Desktop Manager 之类工具连
命令行适合测试,日常开发和排查还是需要一个可视化客户端。目前大家用得比较多的是 Redis Desktop Manager(RDM)和 Another Redis Desktop Manager(ARDM)。后者开源免费,跨平台,对 Redis 7.x 的支持也不错,我最近一直在用。
新建连接的界面很简单,一般只需要填:
- Name:连接名,比如
local-redis - Host:服务器 IP,本地就填 127.0.0.1
- Port:默认 6379
- Password:如果设置了 requirepass,就填对应密码
如果 Redis 跑在 Docker 里,Host 填宿主机 IP 或者 localhost,Port 填映射出去的端口。连接成功后,你就能看到所有 key,按类型查看数据,甚至还能执行命令行。对于看缓存是否击穿、检查某些 key 的过期时间,这类工具比指令效率高很多。
有个实用小技巧:如果连接的是内网服务器,又不想在安全组里开放 6379 端口,你可以用客户端自带的 SSH Tunnel 功能,跳板机 SSH 到内网,再连接 Redis。这样不用在服务器上开任何额外端口,安全性和便利性都兼顾。
5.3 连接失败:先按这个顺序排查
新人连接 Redis 失败时特别容易慌。我的排查顺序是:
- 服务有没有在跑:执行
ps aux | grep redis-server或systemctl status redis。 - 本机能不能连:先
redis-cli ping,如果本机都连不上,检查配置文件和启动日志。 - bind 是否允许:如果从另一台机器连,确认 Redis 的 bind 包含了目标网卡,或者设为 0.0.0.0。
- 密码是否正确:本地连不上不一定是密码错,但远程连接如果没有
-a,Redis 会返回NOAUTH Authentication required。 - 防火墙/安全组:本机能连,远程连不上,大概率是防火墙或云服务器的安全组没放行 6379 端口。
- Docker 端口映射:如果 Redis 在容器里,确认
docker ps里的0.0.0.0:6379->6379/tcp映射是否存在。
这套顺序基本能解决 80% 的连接问题。剩下的可能是网络链路、ACL 配置、SELinux 等,就需要看具体日志了。
6. 上线前踩过的坑:常见告警与排查实录
6.1 启动时的内核参数告警
第一次用源码编译在 Linux 上启动 Redis 时,日志里经常出现两三行大写的 WARNING。最常见的是:
text复制WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
第一句是 TCP 连接队列长度被内核限制,第二句是内存分配策略问题。还有遇到 transparent hugepage(THP)开启导致延迟波动的警告。
处理方式:
bash复制# 临时生效
sysctl vm.overcommit_memory=1
sysctl net.core.somaxconn=1024
# 永久写入配置
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
sysctl -p
THP 需要在系统层面关闭:
bash复制echo never > /sys/kernel/mm/transparent_hugepage/enabled
想持久化,可以把它写进 /etc/rc.local 或 systemd tmpfiles 规则。这些告警不影响 Redis 立即启动,但会影响持久化成功率、性能和稳定性,上线前最好都处理干净。我自己第一次忽略这些告警,结果半夜内存压力高时后台 save 失败,数据差点没保住。
6.2 连接被拒和访问缓慢的排查思路
“连接被拒绝”和“连接后访问慢”是两个不同方向。前者多跟 bind、防火墙、密码有关,后者往往和以下因素相关:
- maxmemory 设置太小,写命令触发了频繁淘汰。
- AOF 刷盘策略配成 always,每次写都 fsync,性能下降明显。
- 没有设置密码但用
CONFIG SET requirepass后,旧连接仍然保持,新连接全部被拒。 - 网络跨机房、跨区,RTT 高,却被业务当成 Redis 自身慢。
排查时可以先用 redis-cli --latency 看一下本机到 Redis 的延迟,再执行 info stats 看瞬时命令数。如果 instantaneous_ops_per_sec 很高但响应慢,看一下 connected_clients 是不是打满了,以及 blocked_clients 是否有大量阻塞。常见案例是 List 的 BRPOP 或 Redis 的分布式锁阻塞调用过多,导致客户端连接堆积。
6.3 数据丢失和数据错乱:最需要防的两件事
数据丢失场景,我印象最深的是有人把 Redis 当“临时缓存”用,API 也没限制,结果那台机器突然断电重启,Redis 里几百万 key 全没了,一查配置发现 appendonly 还是 no,RDB 的默认 save 条件也没触发几次。这种案例不是 Redis 的问题,是部署时没有认真配置持久化。
避免数据丢失的基本动作:
- 设置并确认
appendonly yes。 - 定期做 RDB 备份,备份文件要异地或至少不同目录。
- 测试过从 AOF/RDB 文件恢复,不然真出故障时才发现恢复流程没人走过。
数据错乱也比较隐蔽,常见是客户端连接了错误的 Redis 实例。比如你本地起了一个 Redis,又用 Docker 起了一个 Redis,端口都是 6379,其中一个启动失败但没看出错误,导致业务写到了预期之外的实例。我建议你在每个环境启动后,先执行 redis-cli info server 看 run_id 和 tcp_port,确认自己连的是不是目标实例,多花一分钟能省很多事。
6.4 常用性能排查命令
配合安装配置,我建议把这些命令记到小本子上,排查时能救命:
bash复制# 模拟读写测试
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -q
# 检查网络延迟
redis-cli --latency
# 扫描大 key
redis-cli --bigkeys
# 查看慢查询
redis-cli slowlog get 10
redis-cli slowlog len
--bigkeys 会扫描所有 key,对线上实例慎用,最好在低峰期执行,否则本身也会增加负载。慢查询是定位“某个命令特别慢”的利器,默认阈值 10000 微秒,可以调成 5000 甚至 2000,方便你抓出那些 O(N) 操作。
7. 从安装配置到生产可用的个人建议
7.1 先把基础命令和数据模型玩熟
安装配置只是入口,真正拉开差距的是对命令和数据结构的理解。想快速验证学习成果,可以给自己定几个小任务:写一个带过期时间的缓存工具类;用 ZSet 实现一个排行榜;用 List 实现一个简单的延迟任务队列。做完这些,你对 Redis 的体感会完全不一样。
7.2 生产环境建议从第一天就做监控
很多人上线 Redis 后只关注“能不能连上”,其实更应该关注内存、连接数、hit ratio、慢查询。哪怕先用 redis-cli info 定时简单收集,也比完全裸奔好。条件允许就接入 Prometheus + redis_exporter,告警规则设一下:内存超过 maxmemory 的 80%,连接数突然飙升,主从复制断连超过 5 分钟。这套东西越早做越省心。
7.3 一个非常务实的小习惯
每次改配置文件前备份,改完先 redis-server /path/redis.conf 在前台跑一下,看到日志没有 ERROR 再切到 systemd 或后台启动。这个“前台试跑”的步骤我已经坚持了很多年,它比任何配置检查工具都直观。等你见过凌晨三点的 Redis 日志,就会明白安装配置阶段多花半小时,后面能少熬好几个晚上。
