Skip to content

02|安装与连接

上一篇认识了 Redis。这一篇把它装起来、连上去、让命令能跑。

装机这事本身不复杂,但有几处容易卡住:装完默认监听只在本地、配置改了启动不起来、systemd 管理进程的方式和想象不同。本篇把这些节点讲清楚。密码认证、内存淘汰这些放到后面专门讲,这里先把"装好能连"走通。

一、装之前先确认要哪个

上一篇说过,Redis 和 Valkey 命令基本通用,但二进制名和包名不同。云环境或想要开源版本的装 Valkey,存量项目用 Redis 的继续装 Redis。本篇以 Redis 为例,命令几乎一一对应到 Valkey(redis-servervalkey-serverredis-clivalkey-cli)。

两种安装方式,按场景选:

方式适用特点
系统包测试、快速试用一条命令装好,版本受发行版限制
源码编译生产、要固定版本版本自选、参数可控、路径统一

生产推荐源码编译——版本固定、路径统一,不依赖系统的 Redis 版本节奏。

二、系统包安装

最快的先手:

bash
# RHEL / Rocky
yum install -y redis
systemctl enable --now redis

# Debian / Ubuntu(注意:Debian/Ubuntu 较新版本默认包名可能是 valkey)
apt update
apt install -y redis-server
systemctl enable --now redis-server

装完确认版本和进程:

bash
redis-server --version
redis-cli ping
# PONG

redis-cli ping 返回 PONG 就说明实例起来了、能连上。这是后面所有连接检查的第一步。

包安装的文件散落在系统各处,关键路径:

路径内容
/etc/redis/redis.conf/etc/redis.conf配置文件
/var/lib/redis数据目录
/var/log/redis日志

具体用 rpm -ql redis(RHEL)或 dpkg -L redis-server(Debian)查全部文件位置。

三、源码编译安装

生产环境要固定版本和路径,用源码编译。先装编译依赖:

bash
# RHEL / Rocky
yum install -y gcc make tcl

# Debian / Ubuntu
apt install -y build-essential tcl

下载、解压、编译:

bash
cd /usr/local/src
curl -O https://download.redis.io/releases/redis-7.4.x.tar.gz
tar -xf redis-7.4.x.tar.gz
cd redis-7.4.x
make -j$(nproc)            # 并行编译,加快速度
make install PREFIX=/usr/local/redis    # 装到指定目录

tcl 是为了跑 make test(可选的测试),不装也能编译。

创建运行用户和数据目录——Redis 进程以这个用户身份跑,不需要人登录:

bash
groupadd redis
useradd -r -g redis -s /sbin/nologin redis

mkdir -p /data/redis/{data,logs,tmp}
chown -R redis:redis /data/redis

数据目录分三块:data 放 RDB/AOF 文件、logs 放日志、tmp 放 pid 和 socket。分开管理方便备份和排查。

四、最小配置文件

源码编译后没有现成配置文件,自己写一个。最小可用版本:

ini
# /etc/redis/redis.conf
bind 127.0.0.1 10.0.0.5          # 监听本机和内网,不要写 0.0.0.0 暴露公网
port 6379
protected-mode yes               # 保护模式:没设密码时不允许外网访问

daemonize no                     # systemd 管理时设 no,让 systemd 接管
pidfile /data/redis/tmp/redis.pid
logfile /data/redis/logs/redis.log
dir /data/redis/data             # RDB/AOF 存放目录

maxmemory 2gb                    # 内存上限,超出按淘汰策略处理
maxmemory-policy noeviction       # 淘汰策略,noeviction 表示满了直接报错

几个容易踩的点:

bind 不要写 0.0.0.0——把 Redis 暴露到公网是高危行为,Redis 历史上有过多起因暴露被植入勒索程序的事。绑本机和内网 IP 就够。

daemonize no 配合 systemd——很多人第一反应是设 daemonize yes 让进程后台跑,但用 systemd 管理时要设 no:systemd 自己负责守护进程,Redis 设成前台运行 systemd 才能正确跟踪它的状态。

maxmemory 生产必须设——不设的话 Redis 会一直吃内存直到系统 OOM。noeviction 是最稳的默认(满了报错而不是删数据),淘汰策略下一篇章专门讲。

五、用 systemd 管理

systemd unit 文件:

ini
# /etc/systemd/system/redis.service
[Unit]
Description=Redis Server
After=network.target

[Service]
Type=notify                       # 配合 daemonize no,Redis 用 sd_notify 通知就绪
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Type=notify 和配置里 --supervised systemd 配套——Redis 启动好后主动通知 systemd,systemd 才认为服务起来了,而不是靠猜进程在不在。

启动并验证:

bash
systemctl daemon-reload
systemctl enable --now redis
systemctl status redis --no-pager
redis-cli ping
# PONG

六、用 redis-cli 连接和操作

redis-cli 是 Redis 自带的命令行客户端,连上后能交互式敲命令:

bash
redis-cli
127.0.0.1:6379> SET hello world
OK
127.0.0.1:6379> GET hello
"world"
127.0.0.1:6379> DEL hello
(integer) 1
127.0.0.1:6379> EXIT

也可以一条命令执行后退出,适合脚本:

bash
redis-cli SET hello world
redis-cli GET hello
# world

连远程或带端口的实例:

bash
redis-cli -h 10.0.0.5 -p 6379

设了密码后加 -a(但密码会出现在命令行历史,生产环境用 --askpass 或配置文件更安全):

bash
redis-cli -h 10.0.0.5 -a 'yourpassword'

七、启动后的检查清单

新装实例,跑几条命令确认状态健康:

bash
# 服务的版本和基本信息
redis-cli INFO server | head -20

# 内存使用情况
redis-cli INFO memory | grep used_memory_human

# 连接数
redis-cli INFO clients | grep connected_clients

# 数据量
redis-cli DBSIZE

INFO server 看版本、启动时间、进程 ID;INFO memory 看用了多少内存、吃了多少碎片;INFO clients 看当前连接数;DBSIZE 看有多少个 key。这四条是日常巡检的起点,后面的监控运维篇会展开。

八、装不起来的几个常见原因

端口被占用bind on TCP port failed 说明 6379 被占了。ss -lntp | grep 6379 看是谁占的。

目录权限不对pidfiledir 指向的目录 redis 用户没权限写。ls -ld /data/redis/*journalctl -u redis 一起看。

配置参数不认:日志里 unknown directive 说明写了新版本才有的参数,或拼错了参数名。改回标准参数名。

连接被拒绝Could not connect to Redis at 127.0.0.1:6379: Connection refused——实例没启动,或 bind 的地址不对。先 systemctl status redis 看进程在不在。

装好之后

Redis 跑起来了,能连能存能取。下一篇开始讲数据类型——Redis 最核心的内容。先从最基础的 string 和键空间操作讲起,再扩展到 hash、list、set、zset。