个人主页:
> 我不会起名字322 < (欢迎各位大佬莅临😊)
其他栏目:
> 技术栈学习笔记 <
其他栏目:
> 力扣Hot100题目解析 <
其他栏目:
> Go项目学习笔记 <
文章目录
- Redis 入门(一):Redis 是什么,为什么后端都离不开它
-
- 一、Redis 到底是什么
-
- 1.1 一句话定位
- 1.2 它不是 MySQL 的替代品
- 1.3 Redis 为什么快
- 1.4 四个最典型的使用场景
- 二、把 Redis 装上
-
- 2.1 Linux 源码编译安装
- 2.2 用包管理器安装
- 2.3 Docker 一条命令起一个
- 三、启动、关闭与配置
-
- 3.1 两种启动方式
- 3.2 三种关闭方式
- 3.3 redis.conf 里新手最该先看的五个参数
- 四、第一次用 redis-cli 连上并验证
-
- 4.1 连接
- 4.2 依次验证这几条
- 4.3 不进入交互模式直接用
- 五、常见启动报错与排查
- 小结
Redis 入门(一):Redis 是什么,为什么后端都离不开它
这篇只干一件事:把 Redis 的定位讲清楚,再带你从零把它装起来、启动、连上、跑通几条命令。适合刚开始学后端、还没有真正用过缓存的同学,也适合环境荒废很久、想重新把 Redis 跑起来的开发者。看完之后,你应该能独立完成一次安装与验证,并且知道配置文件里哪几个参数先别乱改。
一、Redis 到底是什么
1.1 一句话定位
Redis 的全称是 Remote Dictionary Server,直译过来就是"远程字典服务"。它的核心特征只有两条:数据放在内存里,组织方式是 key-value,然后通过网络把读写能力开放给别的进程。
这句话里"远程"两个字很关键。如果只是单个程序自己用,那用语言内置的 Map 就够了,没必要再引入一个中间件。真正的价值出现在多台机器、多个服务需要共享同一份状态的时候——这时候某个进程的内存变量没法给别的进程看,而 Redis 可以。
所以更准确的说法是:Redis 是一个基于网络的内存数据存储服务,它同时具备"缓存"和"数据库"两种角色。
1.2 它不是 MySQL 的替代品
两者的差异从存储介质就开始了:
| 数据落在哪 | 磁盘为主 | 内存为主 |
| 组织方式 | 表 / 行 / 列 | key-value |
| 定位 | 全量、可靠地保存数据 | 快速读取热点数据 |
| 容量 | 大,可以分库分表 | 受内存限制,单机通常几十 GB |
MySQL 面对的问题不是"不可靠",而是"每次查询都要碰磁盘,慢"。互联网业务里读操作往往远多于写操作,如果每次都打到 MySQL,数据库很快就会成为瓶颈。业界的经典做法是二八原则:把访问最频繁的那 20% 数据放进 Redis,让它承接 80% 的读请求,剩下的全量数据仍然老老实实存在 MySQL 里。
这里有个新手最容易忽略的点:一旦引入 Redis 缓存,就凭空多出了"两边数据可能不一致"的问题。所以缓存的定位是加速,不是权威数据源。Redis 挂了、数据被清了,业务应该还能从 MySQL 重新加载回来,而不是直接崩掉。
1.3 Redis 为什么快
面试常问,但答案不该只背"因为它在内存里"。主要有四点:
顺便澄清一个常见误解:Redis 6.0 之后确实引入了多线程,但多线程只用在了网络收发这类 IO 处理上,命令的执行依旧是单线程。所以"Redis 是单线程"这个说法在今天依然基本成立。
1.4 四个最典型的使用场景
- 缓存:最常见的用法。热点商品详情、首页配置、用户基础信息,先查 Redis,没有再回查 MySQL 并写回缓存。
- 分布式锁:多台机器要争抢同一个资源(比如定时任务只允许一个节点执行),靠 Redis 的 SET NX 加上过期时间来做互斥。
- 计数器:文章阅读量、接口调用次数、点赞数。Redis 的原子自增命令天然适合,而且不用担心并发覆盖。
- 排行榜:游戏积分榜、热搜榜。Redis 自带按分数排序的数据结构,插入和取 Top N 都很轻松。
会话共享(把 session 从单机挪到 Redis)、简单的消息队列也在使用范围之内,但业内有更专业的选择,不必强求。
二、把 Redis 装上
下面三条路任选其一即可。生产环境的正确选择是 Linux,Windows 上用官方移植版或者干脆上 Docker / WSL。
2.1 Linux 源码编译安装
想用最新版本、或者需要自己调编译参数时选它:
# 1. 装编译依赖(以 CentOS 为例,Ubuntu 换成 build-essential)
yum install -y gcc make wget
# 2. 下载并解压源码包
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz
# 3. 编译,并把可执行文件装到 /usr/local/bin
cd redis-7.2.4
make
make install
# 4. 准备配置文件和目录
mkdir -p /etc/redis /var/lib/redis
cp redis.conf /etc/redis/redis.conf
make 这一步如果报错说找不到 jemalloc,可以改用 make MALLOC=libc。编译完成后 redis-server、redis-cli 都在 /usr/local/bin 下,任何目录都能直接调用。
2.2 用包管理器安装
图省事就用系统仓库的版本,缺点是版本通常偏旧:
# Ubuntu / Debian
sudo apt update
sudo apt install -y redis-server
# CentOS / RHEL,需要先装 EPEL 源
sudo yum install -y epel-release
sudo yum install -y redis
用包管理器装完会自动注册 systemd 服务,配置文件在 /etc/redis/redis.conf(CentOS 是 /etc/redis.conf)。
2.3 Docker 一条命令起一个
本地开发、临时验证场景,这是最省心的方式:
docker run -d \\
–name redis-dev \\
-p 6379:6379 \\
-v redis-data:/data \\
redis:7.2 \\
redis-server –appendonly yes –requirepass 123456
几个参数值得说明:-p 把容器端口映射到宿主机;-v 挂一个数据卷,否则容器删了数据也一起没了;命令末尾的 –appendonly yes 打开 AOF 持久化,–requirepass 直接设密码。注意这里的密码写在启动命令里,只适合开发环境,生产上应该走配置文件或密钥管理。
三、启动、关闭与配置
3.1 两种启动方式
前台启动(调试用,关掉终端进程就结束):
redis-server /etc/redis/redis.conf
成功后会看到一段 ASCII 图案、版本号、监听端口 6379,以及 Ready to accept connections。
systemd 托管(推荐的长期运行方式):
sudo systemctl start redis-server
sudo systemctl enable redis-server # 开机自启
sudo systemctl status redis-server
3.2 三种关闭方式
# 方式一:客户端命令,会触发一次保存,最优雅
redis-cli shutdown
# 方式二:systemd
sudo systemctl stop redis-server
# 方式三:暴力杀进程,不推荐,可能丢数据
kill -9 PID
3.3 redis.conf 里新手最该先看的五个参数
# 只监听本机回环地址,最安全的默认值
bind 127.0.0.1 -::1
# 监听端口,也是 redis-cli 默认连接的端口
port 6379
# 是否以后台守护进程方式运行
daemonize no
# 访问密码,注释掉表示不需要密码
requirepass yourStrongPassword
# 保护模式,没有密码且对外暴露时的一道兜底防线
protected-mode yes
逐个说清楚:
- bind:默认只绑本机。要让别的机器连过来,必须改成 bind 0.0.0.0,但这等于把服务暴露到网络上,务必同时设置 requirepass。更稳妥的做法是绑内网网卡 IP。
- port:改成非 6379 可以减少被扫描的概率,改完客户端要加 -p。
- daemonize:自己手动跑 redis-server 时设成 yes 可以让它转入后台。但用 systemd 托管时应该保持 no,因为 systemd 本身就在管后台进程,daemonize yes 会让它 fork 出去,systemd 追踪不到主进程,出现"服务显示启动成功但实际已退出"的诡异现象。
- requirepass:设了之后所有客户端都必须先认证。配置里如果还写了 masterauth,主从之间也要一致。
- protected-mode:这是 Redis 3.2 引入的兜底机制。当既没有设密码、又监听了非回环地址时,它会拒绝外部连接并返回一段 DENIED 提示。它是"防呆"而不是"防护",正确做法是配好密码和 bind,而不是简单地把 protected-mode no 一关了事。
四、第一次用 redis-cli 连上并验证
redis-cli 有两个使用形态:交互式(进去之后一直敲命令)和一次性执行(把命令当参数传进去,结果打印到标准输出)。下面主要用交互式。
4.1 连接
# 本机默认端口,直接进
redis-cli
# 指定主机端口密码,并直接进 0 号库
redis-cli -h 127.0.0.1 -p 6379 -a 123456
进入后会看到提示符 127.0.0.1:6379>,代表已连上,并且默认处于 0 号库。注意 -a 会把密码暴露在 shell 历史和 ps 输出里,Redis 也会打印一行告警,生产环境建议改用 REDISCLI_AUTH 环境变量。
4.2 依次验证这几条
127.0.0.1:6379> ping
PONG
用途:最简单的存活探测。返回 PONG 说明连接通了。如果启用了密码而没认证,这里会返回 (error) NOAUTH Authentication required.,先执行 auth 123456 即可。写健康检查脚本时可以用 ping 的返回值判断。
127.0.0.1:6379> set user:1:name "tom"
OK
127.0.0.1:6379> get user:1:name
"tom"
127.0.0.1:6379> get user:2:name
(nil)
用途:写入和读取一个 key。返回 OK 表示写成功;取到不存在 key 时返回 (nil) 而不是报错,写代码时不要把 nil 当成异常。注意 key 名是区分大小写的,User:1 和 user:1 是两个不同的 key;命令名本身则不区分大小写。
127.0.0.1:6379> keys user:*
1) "user:1:name"
用途:按通配符查看当前库里有哪些 key,排查数据有没有写进去时很方便。但这条命令要慎用:它是全量扫描,key 数量一多就会阻塞整个实例,生产环境严禁执行 keys *。需要遍历时改用 scan 游标分批取。
127.0.0.1:6379> dbsize
(integer) 1
用途:返回当前库里 key 的总数。返回类型带 (integer) 前缀,说明 Redis 的回复是分类型的(字符串、整数、数组、错误、nil)。如果希望输出更适合喂给脚本,可以加 –raw:
redis-cli –raw dbsize
1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379>
用途:切换数据库。Redis 默认有 16 个库(编号 0~15),切换成功后提示符会多出 [1] 这样的标记,一眼就能看出当前在哪个库。这里的库只是命名空间隔离,不是分片,多个库共用同一个单线程,别把它当成隔离故障的手段。另外 select 只影响当前这个连接。
127.0.0.1:6379> info server
# Server
redis_version:7.2.4
redis_mode:standalone
os:Linux 5.15.0-91-generic x86_64
tcp_port:6379
uptime_in_seconds:132
用途:查看运行状态。不带参数会输出全部信息,信息量很大;建议按段查看,比如 info server 看版本和运行模式、info memory 看内存占用、info clients 看当前连接数、info stats 看命中率。排查"内存怎么涨这么快"时,used_memory_human 和 mem_fragmentation_ratio 是最先该看的两项。
127.0.0.1:6379> shutdown
not connected>
用途:关停服务端。执行后当前连接会被服务端断开,提示符变成 not connected>,这属于正常现象,不是报错。shutdown 默认会在退出前保存一次 RDB 快照;如果只是想断开客户端而让服务端继续跑,应该按 Ctrl+C 或者输入 quit。
4.3 不进入交互模式直接用
排查问题时经常只需要跑一条命令,这时不必进交互模式:
redis-cli ping
redis-cli -a 123456 set weather sunny
redis-cli -a 123456 get weather
redis-cli -r 5 incr page:view # 连跑 5 次
redis-cli –stat # 每秒刷新一次运行指标
-r 指定执行次数,配合 -i 还能指定间隔秒数,比如 -r -1 -i 1 info memory 可以一直循环输出内存信息。–stat 会持续打印 keys、内存、连接数、请求数等增量指标,比反复敲 info 直观得多。
五、常见启动报错与排查
1)DENIED Redis is running in protected mode…
连接被拒,且提示里带 protected-mode。原因是没设密码又对外监听。正确解法是二选一:设置 requirepass 并把 bind 收窄到内网地址,或者老老实实从本机连。不要为了图快直接关掉保护模式。
2)(error) NOAUTH Authentication required.
服务端要求密码,而客户端没认证。临时办法是在交互模式里执行 auth 你的密码;长期办法是连接时带 -a,或者设置环境变量 REDISCLI_AUTH。顺带一提,requirepass 改完之后必须重启或执行 config rewrite 才对外生效,改完忘了重启是最常见的"密码明明设了却没生效"。
3)Could not connect to Redis at 127.0.0.1:6379: Connection refused
服务端根本没在跑,或者不在这个地址端口上。排查顺序:ps -ef | grep redis 看进程在不在 → ss -lntp | grep 6379 看端口有没有监听 → 检查 bind 和 port 配置是否和你连的一致。
4)Could not create server TCP listening socket *:6379: bind: Address already in use
端口被占用,通常是上一次的 Redis 没退干净。先找出占用者:
ss -lntp | grep 6379 # 或 netstat -tlnp | grep 6379
确认是旧实例后正常关掉它,或者改配置文件里的 port 换一个端口。别上来就 kill -9,容易丢数据。
5)启动成功但连接超时
进程活着、端口也在监听,但客户端连不上,一般是防火墙或安全组没放行。云服务器上要同时检查系统防火墙和安全组规则。如果 bind 只写了 127.0.0.1,那外部无论如何都连不进来,这点要先确认。
6)daemonize 和 systemd 打架
现象是 systemctl start 显示成功,但 systemctl status 立刻变成 inactive。因为 daemonize yes 会让 Redis fork 到后台,systemd 认为主进程已经退出。用 systemd 托管时把 daemonize 设为 no,让 systemd 自己管前后台。
7)改完配置没生效
Redis 读的是你启动时指定的那份配置文件,路径写错就会用内置默认值。启动时用 redis-server /etc/redis/redis.conf 显式指定路径,启动日志的第二行会打印实际加载的配置文件名,对不上就说明路径错了。
小结
这一篇我们把 Redis 的定位讲清了:它是靠内存和网络提供 key-value 读写能力的服务,擅长缓存、分布式锁、计数器和排行榜,和 MySQL 的分工是"热点加速"与"全量可靠";接着走完了源码、包管理器、Docker 三条安装路线,理清了 bind、port、daemonize、requirepass、protected-mode 这五个先要弄明白的配置,最后用 ping、set/get、keys、dbsize、select、info、shutdown 完成了一轮真实验证,并覆盖了几类典型报错。
现在你手里有了一个能连上的 Redis,但往里存东西还只会用 set 和 get。key 到底能设计成什么样、除了字符串还能存哪些结构、什么场景该用哪种结构,这些是下一步真正要解决的问题——下一篇我们看 Redis 的五大数据类型,以及每个类型最常用、最容易踩坑的那几条命令。
网硕互联帮助中心



评论前必须登录!
注册