news 2026/9/9 22:46:01

Redis 服务启动与停止全攻略:从原理到实操的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis 服务启动与停止全攻略:从原理到实操的完整指南

Redis 服务启动与停止,你真的搞明白了吗

做后端开发这些年,Redis 大概是除了 MySQL 之外用得最频繁的中间件了。但有意思的是,很多人在 Redis 装好之后,连“怎么正确启动、怎么优雅停止”都没完全搞明白。我见过不少同事在服务器上直接 Ctrl+C 把前台 Redis 进程干掉,结果数据没来得及持久化;也见过有人把daemonize yes写在命令行参数里导致启动失败,一脸懵地跑来问我。这篇内容没有太多高深的理论,就是把 Redis 服务启动与停止这件事,从原理到实操,从 Linux 到 Windows 到 Docker,完整地拆一遍。如果你正在被 Redis 的启动方式、关闭方式、各类报错折腾,这篇文章应该能帮你省下不少时间。

1. 启动方式的选择:前台与后台的权衡

1.1 为什么默认是前台启动

刚接触 Redis 的人,第一次在终端里执行redis-server时,往往会被满屏的日志刷得不知所措——光标停在那里,终端被“占用”了,好像程序卡住了。其实这就是 Redis 的默认行为:前台启动。此时 Redis 进程直接挂在你当前的终端会话下,所有运行日志都往标准输出里打。你一旦把终端关掉,Redis 进程也会跟着退出。

那为什么官方要把默认行为设置成前台?我个人的理解是,这在很大程度上是为了“简单直观”:你启动它,立刻就能看到日志,立刻知道它到底有没有跑起来,配置有没有报错。对于开发调试来说,这种模式其实特别方便。比如我刚改完redis.conf,不确定配置是否合法,直接前台起一下,几秒钟之内日志就能告诉我答案,不对就 Ctrl+C 改掉再来。要是后台跑了,我还得再去翻日志文件,白白多一步。

但前台启动有个致命问题:生产环境不可能长期靠一个终端挂着进程。一旦 SSH 会话断开,Redis 直接跟着没了,这显然不可接受。所以就有了下面的后台启动方式。

1.2 后台启动的两条路:daemonize 与 nohup

标准的后台启动方式,是在配置文件里把daemonize yes打开。这样 Redis 启动后会 fork 出一个子进程,然后父进程退出,你的终端立刻恢复可用。Redis 自身会以守护进程的方式常驻在系统里,日志也不再打到终端,而是写到logfile指定的文件里。

除了改配置文件,还有一种临时方案是启动时用命令行参数指定:redis-server --daemonize yes --logfile /var/log/redis/redis.log。这种方式适合临时测试,或者你不想动配置文件的时候应急用一下。注意这里有个小坑:--daemonize yes必须写在redis-server后面,要是写在了配置文件的参数之前,是有可能被配置文件里的原有设置覆盖掉的。

还有一部分人会选择nohup redis-server &这种方式。我在早期管理 Redis 的时候也这么干过,但后来发现这其实是个偷懒但不优雅的方案。nohup本身的价值在于让进程忽略挂断信号,但 Redis 已经提供了原生的daemonize方案,自己管理进程、信号和日志,没必要再多套一层。用nohup还有一个隐患:日志默认会写到一个nohup.out文件里,这个文件如果没有定期清理,日在长期运行后能轻松吃掉几个 GB 的磁盘空间。所以我的建议是:能用daemonize yes就优先用它,别用nohup凑合。

1.3 两种启动方式的适用场景和我的建议

从场景上来区分的话:

  • 本地开发、快速验证配置:推荐前台启动。日志实时滚动,Ctrl+C 停掉,干净利落。
  • 本地长期挂机、测试环境:推荐daemonize yeslogfile。既能看到日志,又不占终端。
  • 生产环境:不要只依赖daemonize yes,更推荐用systemd或 Docker 来托管。系统重启后能自动拉起,进程挂了也能自动恢复。这一点我下面会详细说。

顺便提一句,很多从 Windows 转过来的开发者习惯“双击 exe 启动、任务管理器杀进程”的模式。在 Linux 上千万不要养成“启动靠裸进程、停止靠kill -9”的习惯,后面你会为此付出代价的。接下来我按最常遇见的几种部署环境,分别说启动与停止的具体做法。

2. 多环境下的启动与停止实操

2.1 Linux 源码编译部署后的最简单操作

先以最典型的“编译安装”方式为例。源码编译后,Redis 的可执行文件通常位于src目录下,配置文件模板在根目录的redis.conf。编译完成之后,我习惯把可执行文件复制到/usr/local/bin,把配置文件复制到/etc/redis目录下,这样后续管理起来更顺手。

启动命令很简单:

# 指定配置文件路径,前台启动(如果配置里 daemonize no) /usr/local/bin/redis-server /etc/redis/redis.conf

如果配置里已经开启了daemonize yes,那么执行完这条命令之后终端会立刻返回。你可以用下面这个命令确认进程是否起来了:

ps -ef | grep redis-server | grep -v grep

正常你会看到一条类似这样的记录:

redis 12345 1 0 10:00 ? 00:00:01 /usr/local/bin/redis-server 127.0.0.1:6379

注意 PID 那一栏后面的 PPID(父进程ID)是 1,这说明它确实以守护进程方式托管给了 init 系统。

停止的时候,优先用 Redis 自带的客户端工具,而不是直接杀进程:

/usr/local/bin/redis-cli -p 6379 shutdown

如果设置了密码,需要带上-a参数(注意这会带来密码泄露风险,生产环境更推荐通过环境变量或交互式输入来避免历史记录泄露,下面我还会讲):

/usr/local/bin/redis-cli -p 6379 -a yourpassword shutdown

shutdown命令会让 Redis 进程自己收拾干净再退出:先停掉接收新请求,然后根据配置执行持久化操作,最后才真正退出。这个顺序至关重要,后面我会专门展开讲。

2.2 用 systemd 托管 Redis 服务的做法

如果你部署的机器是 CentOS 7+、Ubuntu 16.04+ 这类使用 systemd 的系统,我强烈建议你写一个 service 文件交给 systemd 管理。好处是用systemctl start redissystemctl stop redissystemctl restart redis就能统一管理,而且在服务器意外重启后,Redis 会跟着系统自动启动,不用你每次手动拉起。

service 文件一般放在/etc/systemd/system/redis.service,一个最小可用的配置长这样:

[Unit] Description=Redis Server After=network.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown Restart=always User=redis Group=redis PIDFile=/var/run/redis.pid [Install] WantedBy=multi-user.target

这里注意Type=forking很关键。因为 Redis 开启daemonize yes后,启动命令执行完会立刻返回,真正的 Redis 进程是 fork 出来的子进程。systemd 怎么判断服务启动成功了?就是靠PIDFile里写的那个 PID 文件。所以你要确保配置文件里pidfile的路径和 service 文件里的PIDFile保持一致,不然 systemd 有可能会误判服务状态。

配好之后,先systemctl daemon-reload重载,再systemctl enable redis设置开机自启,然后systemctl start redis启动。停止和重启就直接:

systemctl stop redis systemctl restart redis

有了 systemd 之后,你甚至可以设置Restart=always,这样 Redis 万一因为内存溢出或者别的异常退出了,systemd 会立刻帮你重新拉起来。这个配置我在生产环境一直开着,实测非常稳。当然,你得配合监控一起用,不然进程被反复拉起又反复崩溃,你也很难第一时间感知到。

2.3 Windows 下启动与停止的几个常见坑

虽然 Redis 官方一直把 Linux 当成主战场,但 Windows 生态里 Redis 的使用者其实相当多。早期大家用的是微软维护的一个移植版本,后来 Redis 官方在 5.0 之后直接提供了 Windows 支持,再后来 7.x 版本在 Windows 上的表现已经挺不错了。不过 Windows 上的启动与停止,和 Linux 还是有明显差异的。

如果你下载的是 zip 包,解压后会看到redis-server.exeredis-cli.exe。直接双击redis-server.exe是前台启动,会弹出黑色控制台窗口,日志在里面滚动。要停止的话,直接关掉窗口也行,但更规范的做法是打开另一个命令行窗口,执行:

redis-cli.exe shutdown

这样 Redis 会走正常的持久化流程退出。你要是直接点窗口右上角的“×”关掉,在某些版本上可能不会触发正常的退出流程,数据没落盘就直接没了,这是 Windows 下非常容易踩的坑。

更推荐的做法是把 Redis 注册成 Windows 服务来管理。你可以使用 WinSW(Windows Service Wrapper)之类的工具,或者直接下载 Redis 官方提供的 MSI 安装包,安装过程中会帮你把服务注册好。之后就能用 Windows 服务管理器来启动和停止了:

net start Redis net stop Redis

或者用 PowerShell:

Start-Service Redis Stop-Service Redis

Windows 下我还遇到过一个大坑:配置文件如果是从网上下载的,或者用记事本编辑过、另存为带 BOM 头的 UTF-8 编码,Redis 解析配置时可能会报一个很奇怪的行解析错误。这种情况在 Linux 上很少见,但 Windows 上却防不胜防。解决方案很简单:统一用 UTF-8 无 BOM 编码保存,推荐用 VS Code 或者 Notepad++ 这类能明确控制编码的编辑器来改配置。

2.4 Docker 容器里的启动、停止与重启

现在很多团队的环境落地直接用 Docker,Redis 也不例外。用 Docker 跑 Redis 的好处是环境隔离、版本切换方便。一个最简启动命令长这样:

docker run -d --name redis-container \ -p 6379:6379 \ -v /data/redis:/data \ redis:7.2

注意-d参数表示后台运行容器,镜像默认的启动命令就是redis-server,并以非 daemon 模式前台运行。这其实是一个细节:容器里的 Redis 必须前台运行,因为容器的主进程必须活着容器才算活着。如果你硬要在容器里让 Redis 以daemonize yes方式启动,容器会发现主进程退出了,于是立刻退出,你的容器就停掉了。第一次用 Docker 跑 Redis 的人很容易在这里栽跟头。

容器方式停止 Redis,有几种思路:

# 方式一:直接停容器 docker stop redis-container # 方式二:进入容器内执行 shutdown docker exec -it redis-container redis-cli shutdown

docker stop会向容器的主进程发送 SIGTERM 信号,Redis 收到后其实也会走优雅关闭流程,所以两种方式都算安全。但docker stop有默认的停机宽限期(默认 10 秒),如果 Redis 正在执行大容量持久化,10 秒内没退出,Docker 会强制发送 SIGKILL,那就可能丢数据。所以我更推荐先docker exec里执行shutdown,等容器自动退出后,再确认状态。当然,你要是用docker-compose或者 Kubernetes 管理,还可以编排健康检查来规避这个问题,但那是另一个话题了。

重启容器就简单了:

docker restart redis-container

这样容器会先停止再启动,适合改完环境变量或者挂载卷配置之后使用。注意docker restart不等同于配置热加载,如果你改了redis.conf并通过卷挂载进容器,必须重启容器才能生效。

3. 如何优雅地停止 Redis

3.1 shutdown 指令的背后:持久化与退出流程

很多人对 Redis 停止这件事的理解就是“杀掉进程”,这是大忌。Redis 虽然号称内存数据库,但它的数据并不是只存在内存里——默认配置下,它会周期性把内存里的数据快照到磁盘上的 RDB 文件里,也可能开启 AOF 日志记录每一次写操作。如果你用kill -9强杀进程,Redis 根本没有机会把最近一段时间的变化持久化到磁盘,重启之后你就会发现数据少了好几条,而且你还很难定位少的是哪几条。

shutdown命令的完整执行流程可以概括为三步:

  1. 停止接收新的客户端请求。
  2. 如果配置了save规则,并且距离上次保存产生了足够多的变更,就触发一次 RDB 快照保存。
  3. 如果开启了 AOF,并且appendfsync设为always,会确保所有已确认的写操作都已刷盘。
  4. 关闭所有客户端连接,退出进程。

这个流程里第 2 步是很多人忽略的。如果你修改过数据但还没到自动保存的时间点,用kill -9杀掉进程,这些未落盘的数据就没了。而执行shutdown时,Redis 会在退出前主动做一次快照保存。换句话说,shutdown不仅仅是一个“退出命令”,它还是一个“保险命令”。

当然,shutdown 也不是永远完美。如果数据量特别大,比如 RDB 快照要写十几 GB,shutdown 会阻塞比较久。此时客户端会看到连接无响应,但千万别以为它卡死了就再去发一个kill -9,那就前功尽弃了。耐心等一会儿,日志里出现“Ready to exit”之类的字样,才是真正结束了。

3.2 携带密码与远程关闭时的细节

Redis 在生产环境一般都会设置requirepass。此时连接客户端执行shutdown需要带上密码。很多人写的命令是:

redis-cli -a mypassword shutdown

这个命令能跑通,但有安全隐患:mypassword会出现在你的 shell 历史记录里。如果你在共享的跳板机上执行过,之后别人翻历史记录就能看到你的 Redis 密码。更稳妥的做法是设置环境变量:

redis-cli -u redis://:mypassword@127.0.0.1:6379 shutdown

或者干脆用交互式方式,先连接再认证再关闭:

redis-cli 127.0.0.1:6379> AUTH mypassword OK 127.0.0.1:6379> SHUTDOWN

个人建议:生产环境不要在命令行里直接带密码,这既是对自己的数据负责,也是一个值得养成的操作习惯。

还有一点要注意,Redis 的protected-mode默认是开启的。如果你没有设置密码,而 Redis 又监听在0.0.0.0上,那么从非本机发过来的shutdown会被拒绝,提示“DENIED Redis is running in protected mode”。这是 Redis 的保护机制,防止你在没有密码的情况下被别人远程关闭或者清空数据。如果你需要远程管理,正确做法是配置好密码和 ACL 权限,而不是把 protected-mode 关掉。我在安全巡检时见过不少把 protected-mode 关掉的案例,结果整个 Redis 裸奔在公网上,这是相当危险的。

3.3 停止前的数据安全自查清单

我每次在服务器上执行 Redis 关闭之前,都会按下面的清单自查一遍,基本可以避免常见的数据安全事故:

  1. 确认当前 Redis 的持久化配置。用redis-cli config get save查看 RDB 快照策略,用redis-cli config get appendonly查看是否开启了 AOF。
  2. 如果有重要的、未落盘的数据变更,先执行一次redis-cli bgrewriteaof或手动触发redis-cli save,再执行shutdown。虽然shutdown本身会做一次 RDB 保存,但你要是对当前数据特别在意,主动触发一次更安心。
  3. 确认没有长时间运行的 Lua 脚本或阻塞命令。如果当前有KEYS *这类阻塞操作正在跑,shutdown可能会等它完成才退出,表现为关闭命令迟迟不返回。你可以通过redis-cli slowlog get查看慢日志,判断当前是否处于繁忙状态。
  4. 如果 Redis 是主从架构中的主节点,停止前最好先通知下游从库做一次全量同步的准备工作,或者直接把流量切换到其他副本上。不然主节点一停,从节点的数据可能出现延迟缺口。

这套自查看起来麻烦,但实际操作下来也就一分钟。毕竟数据是无价的,多一分谨慎不亏。

4. 连接验证与状态检查

4.1 用 ping 和 info 确认服务真正可用

启动 Redis 之后,很多人的习惯是看到进程还在就以为启动成功了。但这还不够——进程起来了,不代表它能正常接受请求。最直接的验证方式是用自带的客户端连一下:

redis-cli -p 6379 ping

如果返回PONG,说明服务已经在正常应答。如果返回PING之后又跟着PONG两行,说明你用的 redis-cli 版本比较新,交互模式下会回显你输入的命令,这时候PONG依旧是关键。

除了 ping,我还习惯看一眼info里的几个核心指标:

redis-cli info server redis-cli info clients redis-cli info memory

重点关注以下几个方面:

  • redis_version:确认跑的是不是你预期的版本。
  • process_id:记录下当前进程 PID,方便后续排查。
  • connected_clients:当前有多少连接。
  • used_memoryused_memory_human:当前内存占用情况。
  • uptime_in_seconds:已经运行了多久。如果这个时间和你启动时间对不上,说明进程可能被偷偷重启过。

有一个容易被忽略的点:redis-cli ping默认连接的是本机 6379 端口。如果你改过端口号,要记得用-p指定,不然会一直提示Could not connect to Redis at 127.0.0.1:6379: Connection refused,然后你会误以为 Redis 没启动成功,结果它其实在别的端口上跑得好好的。

4.2 用可视化工具连接时常见的启动排查思路

很多开发者习惯用 Redis Desktop Manager(RDM)、Another Redis Desktop Manager 或者官方推出的 RedisInsight 来查看和管理数据。工具是个好东西,但工具连不上 Redis 时,问题往往不在工具本身,而在服务端。

以 Another Redis Desktop Manager 为例,连不上时一般有几种情况:

  1. Redis 启动时绑定的地址是127.0.0.1,但你用局域网 IP 去连。这时候需要在redis.conf里把bind改成0.0.0.0或者你的内网网卡地址,然后重启 Redis。
  2. Redis 没有设置密码,但protected-mode又是开启状态。外部连接会被拒绝。这种情况下要么设置一个强密码,要么明确关闭 protected-mode。注意:从 Redis 6.0 开始还引入了 ACL 权限控制,如果你用了默认用户去连,而默认用户没有权限,也会报错。这时候需要单独配置一个用户并赋予对应的数据库权限。
  3. 云服务器安全组或者本地防火墙把 6379 端口挡住了。这是最容易被忽略的——Redis 配置看起来完全正常,但本地用工具怎么都连不上。建议先用telnet或者nc去探测端口通不通,再回头查配置。我之前排查过一起类似的案例,最后发现是云控制台的安全组规则没放行,跟 Redis 本身一毛钱关系都没有。

还有一个比较隐蔽的问题:部分可视化工具在连接时默认使用 TLS/SSL 加密,而这个选项默认是关闭的,如果两边不一致则会握手失败。这种情况通常只在公司内部强制加密传输时才遇到,但一旦碰上,报错信息往往比较费解。建议先在服务端用redis-cli本地连接验证一下,再逐层排查外部工具。

5. 常见问题与排查技巧实录

5.1 端口被占用导致启动失败

这是最经典的启动失败原因。你在启动一个全新的 Redis 实例时,控制台报了一个类似这样的错:

Could not create server TCP listening socket *:6379: bind: Address already in use

原因就是一个——端口被别的进程占了。排查命令很简单:

lsof -i :6379 netstat -tunlp | grep 6379

看到占用进程之后,你会有几个选择:

  • 如果占用者就是之前启动的 Redis(比如你忘了关掉旧实例),直接用它自己的方式关掉,或者换个配置文件。
  • 如果占用者是别的应用,那就在新的 Redis 配置里把port改掉。注意这时候客户端连接也要用对应的端口,不要拿着默认 6379 去连然后各种怀疑人生。

在 Docker 场景下,端口占用还会报另一个错:port is already allocated。这是 Docker 宿主机层面的映射冲突。用docker ps看看有哪些容器占用了端口,或者用docker ps -a看看是否有已退出但没删除的容器残留,继续使用同一个端口。docker-compose down之后旧容器可能还在,记得确认一下。

5.2 启动后进程立即消失

这类问题的典型表现是:执行redis-server /etc/redis/redis.conf后,命令没有报错,但进程马上就没了。多数情况下这是因为配置文件有问题,Redis 在启动阶段失败,但报错信息一闪而过,你没来得及看。

排查思路是先去掉后台启动,强制前台且高日志级别运行:

redis-server /etc/redis/redis.conf --daemonize no --loglevel verbose

这样所有错误信息都会直接打到终端上,能直观地看到具体原因。常见的导致启动后立即退出的原因包括:

  • 配置里的dir目录不存在,Redis 无法在指定目录创建持久化文件。
  • logfile指向的目录没有写权限。
  • pidfile指向的路径错误,Redis 无法创建 PID 文件。
  • 下载的redis.conf文件里混有 Windows 换行符(\r\n),Redis 解析时把\r也读进了参数里,导致配置项不识别。

最后一个原因最坑,因为报错信息往往是一大段看不懂的参数解析错误。解决方案是统一转换成 Unix 换行格式:

sed -i 's/\r$//' redis.conf

5.3 客户端连不上 Redis:拒绝连接还是连接超时

Connection refusedConnection timed out是两个完全不同的信号,排查方向截然不同。

  • Connection refused:说明目标主机收到了你的请求,但那个端口没有服务在监听。可能是 Redis 没启动,或者启动后立刻崩了,或者端口配错了。
  • Connection timed out:说明数据包根本没到达目标主机,或者被防火墙丢弃了。这时候优先查安全组、防火墙规则、网络连通性。

我见过太多人在Connection refused的时候去查防火墙,折腾半天发现 Redis 压根没起来。反过来,也有人一直以为 Redis 没起来,翻来覆去重启服务,结果发现安全组没放行。所以第一步,先判断错误类型,别被误导。

5.4 停止时卡住不动

执行redis-cli shutdown之后,命令迟迟不返回,终端像死了一样。这种情况大多发生在以下几个场景:

  1. 当前有大量写入操作,RDB 快照正在生成,耗时较长。
  2. 有阻塞命令正在执行,比如KEYS *在百万级 key 的环境下运行,Redis 单线程模型决定了 shutdown 必须等它执行完。
  3. AOF 重写正在进行中,需要等待重写完成。

遇到这种情况,先别着急,打开另一个终端,用redis-cli info stats看看当前有没有正在执行的持久化操作,或者用redis-cli slowlog get看看最近的慢命令。确认是在正常干活而不是死锁之后,耐心等。如果实在等不下去,可以kill -TERM发送 SIGTERM 信号,这和shutdown的效果很接近,也会走退出逻辑。只有在这种方式也无效时,才考虑kill -9强杀。

顺带说一句,kill -TERMkill -9虽然都叫“杀进程”,但完全是两回事。-TERM是请求进程自行退出,进程可以选择先处理完手头的关键工作再退出;-9是直接由内核强制结束。能用-TERM就别用-9,这是 Linux 运维的基本素养。

5.5 停止后数据丢失的排查思路

这是最让人头疼的场景:Redis 正常停掉了,重启之后发现数据不对。排查优先级我建议按下面这个顺序来:

  1. 先确认持久化配置。save ""表示禁用了 RDB,那你在 Redis 里写的数据在重启后基本就靠 AOF 了。如果 AOF 也没开,重启丢数据是必然的,不是“异常”,而是“配置本来就如此”。
  2. 检查 RDB 文件的保存时间和内容。ls -l看看 dump.rdb 的修改时间,如果时间比你停止前最后一次写操作早,说明最后那段数据没来得及落盘。
  3. 检查 AOF 文件是否完整。如果 AOF 文件尾部损坏,Redis 启动时会尝试修复,修复不了会拒绝启动。可以用redis-check-aof工具修复,但这个工具不能瞎跑,操作前先备份文件。
  4. 检查是不是重启过程选错了数据目录。dir配置路径如果指向了另一个目录,Redis 可能加载了一个完全不一样的 RDB 文件,看起来像数据丢了,其实就是路径配错了。

这类问题排查起来最耗时,但绝大多数情况都不是 Redis 的 bug,而是配置和操作习惯的问题。

6. 一些不那么起眼但很实用的建议

先说日志。不管是启动还是停止,日志都是第一排查入口。Linux 下我习惯把logfile指定到一个固定目录,比如/var/log/redis/redis.log,然后配合logrotate做切割。Windows 下默认会把日志输出到控制台,如果你用服务方式运行,记得把logfile也配置上,不然出问题后连日志都找不到。

再说配置管理。Redis 的配置项非常多,但启动和停止阶段真正影响你的其实就那几个:daemonizepidfilelogfiledirportbindprotected-moderequirepass。我建议你写一个自己的标准模板,把这几项固定在文件开头,后续每次部署新环境都基于这个模板改,而不是随手网上下载一个乱改。实测下来这个习惯能减少大量低级错误。

最后说一个很多人不知道的点:redis-cli shutdown在 Redis 7.0 之后还支持SHUTDOWN NOSAVESHUTDOWN SAVE两个子参数。NOSAVE表示退出时不保存 RDB 快照,SAVE则表示强制保存后再退出。如果你在开发环境,不在乎数据,用NOSAVE可以让关闭速度快很多;但生产环境,除非你明确知道自己在做什么,否则不要用NOSAVE,老老实实让它默认保存。

我在实际使用中还有一个习惯:启动和停止操作前,都会先看一眼当前是谁在连接 Redis。用redis-cli client list看一下connected_clients,如果发现线上还有业务在发送请求,就不要轻易执行 shutdown。先通知业务方或者确认有实例切换机制,再动手。这种谨慎,帮我避免过好几次线上事故。

Redis 的启动与停止,看似是个基础操作,但里面牵扯到进程模型、持久化、网络绑定、权限控制这些底层逻辑。把这些细节吃透了,后续再遇到集群、主从、哨兵、分片,你都会觉得游刃有余。希望这篇分享能帮你避掉一些我已经踩过的坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 22:42:54

基于双层优化的电动汽车时空调度Matlab实现与KKT求解方法

做电动汽车时空调度这个方向的同行,应该都有同感:最让人头疼的往往不是问题本身的物理含义,而是模型建完之后要么算不动,要么算出来的结果根本没法指导落地。我前两年做大型电动汽车时空调度项目时,就踩过这个坑——第…

作者头像 李华
网站建设 2026/9/9 22:42:00

Ghidra 调试器启动报 Python 包导入错误(如 protobuf)怎么解决

Ghidra 调试器启动报 Python 包导入错误(如 protobuf)怎么解决 【免费下载链接】ghidra Ghidra is a software reverse engineering (SRE) framework 项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra 在 Ghidra 的 Debugger 工具里通过…

作者头像 李华
网站建设 2026/9/9 22:41:52

C++模板编程全解析:从函数模板到特化与编译模型

1. 为什么要学模板:从“复制粘贴”到“让编译器干活”做C开发的人,早晚都要面对模板这道坎。我第一次接触模板时,觉得这东西语法怪异、报错像天书,完全不明白它存在的意义。直到后来写过一个通用容器、做过几个需要支持多种类型的…

作者头像 李华
网站建设 2026/9/9 22:41:25

STM32F103驱动无源蜂鸣器播放音乐:PWM配置与状态机实现

简介:基于STM32F103的无源蜂鸣器发声工程,主要面向嵌入式入门开发者与电子制作爱好者,解决如何利用STM32的定时器/PWM功能驱动无源蜂鸣器,使其按照不同音调与节拍播放旋律。工程内置“红海情歌”和“生日快乐”两首示例曲目&#…

作者头像 李华
网站建设 2026/9/9 22:38:56

把日记变成内容资产:我的每日正经分享完整方法

今日日记正经分享是怎么做出来的?聊聊这半年坚持输出的完整方法“今日日记正经分享”,这名字乍一看有点矛盾——日记嘛,按理说是私密的、随手记的流水账;可加上“正经分享”四个字,性质就完全变了。它不再是自己晚上窝…

作者头像 李华
网站建设 2026/9/9 22:38:19

Maven多模块工程:父项目打包时子模块不构建的解决方案

先说结论:这不是 IDEA 的 bug,也不完全是 Maven 配置写错,而是大多数人对“父项目打包”这个动作的理解和 Maven 实际行为之间差了层窗户纸。我见过不少同事在 IDEA 里对父工程右键,点Maven > Lifecycle > package&#xff…

作者头像 李华