Redis:缓存与队列
在 VDS 上安装 Redis、设置密码并绑定到本地地址、内存限制与淘汰策略,以及缓存与队列的区别。
更新于 2026年8月23日
Redis 将数据保存在内存中,因此常用于缓存、会话、计数器和任务队列。在 VPS 上,它只有在内存装得下时才有用:工作集大于可用内存时,它不再是加速手段,反而会导致崩溃。
安装
apt update && apt install -y redis-server # Debian, Ubuntu
dnf install -y redis # AlmaLinux, CentOS Stream
systemctl enable --now redis-server
redis-cli ping
返回 PONG 表示服务器正在运行。
必要配置
/etc/redis/redis.conf 文件:
bind 127.0.0.1
protected-mode yes
requirepass long-random-password
maxmemory 512mb
maxmemory-policy allkeys-lru
appendonly no
systemctl restart redis-server
redis-cli -a 'password' ping
扫描器会在几分钟内发现暴露在互联网上、没有密码的 Redis,并将其用于挖矿。如果您的应用在同一台机器上,请保留 bind 127.0.0.1,不要将 6379 端口暴露到外部。如果需要外部访问,请只使用 SSH 隧道或 VPN。
内存与淘汰
请显式设置 maxmemory:不设置的话,Redis 会一直增长,直到系统开始终止进程。给它分配该档位内存的四分之一是合理的。
| 档位 | 机器内存 | maxmemory |
|---|---|---|
| VDS-1 | 2 GB | 256 MB |
| VDS-2 | 4 GB | 512 MB |
| VDS-3 | 8 GB | 1–2 GB |
| VDS-5 | 24 GB | 4–6 GB |
策略取决于用途:
- 缓存 —
allkeys-lru,旧键会被静默淘汰; - 任务队列 —
noeviction,丢失任务不可接受,写入报错反而更好。
不要将缓存和队列混在同一个数据库中,正是因为这一矛盾。请将它们分到不同的数据库编号(SELECT 1)或两个实例中。
持久化到磁盘
默认情况下,Redis 会定期将快照转储到 dump.rdb。对于纯缓存来说,这是不必要的磁盘写入 — 请禁用 save。对于队列,请启用 appendonly yes:这样机器重启后任务不会丢失。
请注意,磁盘写入速度受档位限制:每核心 60 MB/s,不低于 60 且不高于 400 MB/s。
监控
redis-cli -a 'password' info memory
redis-cli -a 'password' info stats
redis-cli -a 'password' --stat
redis-cli -a 'password' slowlog get 10
关键指标是 evicted_keys:持续增长意味着内存不足,缓存没有带来收益。
常见错误
| 现象 | 原因 |
|---|---|
NOAUTH Authentication required | 应用未获得密码 |
OOM command not allowed | 在 noeviction 策略下达到了 maxmemory |
DENIED Redis is running in protected mode | 在 bind 127.0.0.1 的情况下进行外部访问 — 这是设计如此 |
| 重启后数据消失 | 未启用持久化 |
| 机器进入 swap | maxmemory 与其他服务之和超过了该档位的内存 |
不要在生产服务器上使用
KEYS *:该命令在遍历所有键时会阻塞 Redis。请使用SCAN进行遍历。