前台启动、客户端连接与daemonize后台化改造
纲要
本文解决 Redis 装好之后「怎么跑起来」的问题:从最朴素的前台启动,到发现它霸占终端的缺陷,最终通过 redis.conf 的 daemonize 配置将其转为后台守护进程。
- 启动服务
- 执行
src/redis-server前台启动 - 启动日志解读:默认端口
6379、进程 ID
- 执行
- 客户端连接
src/redis-cli连接本地服务keys *查看已有键
- 停止服务
- 前台模式下
Ctrl + C终止
- 前台模式下
- 后台化改造
vim的/关键字搜索技巧daemonize no改为yes- 启动时显式指定配置文件
- Windows 平台
- 双击
redis-server.exe与redis-cli.exe
- 双击
启动 Redis 服务
Redis 安装完成后,启动服务的本质就是执行 src 目录下的 redis-server 程序。
bash
cd /usr/local/redis-4.0.0/src
./redis-server
启动后终端输出类似如下日志:
log
_._
_.-``__ ''-._
_.-`` `. `_. ''-._
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 89337
`-._ `-._ `-./ _.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
日志中两个关键信息:
| 信息项 | 值 | 说明 |
|---|---|---|
Port |
6379 |
Redis 默认监听端口,每次启动固定 |
PID |
89337 |
当前进程 ID,每次启动随机分配 |
客户端连接
服务启动后,用 redis-cli 连接。redis-cli 中 cli 即 client 的缩写。
重要 :
redis-server启动后会占用当前终端,必须另开一个终端窗口连接同一台服务器来执行客户端命令。
bash
cd /usr/local/redis-4.0.0/src
./redis-cli
连接成功提示:
127.0.0.1:6379>
提示符中的 127.0.0.1 表示连接的是本机,:6379 即服务端口。
执行第一条命令
bash
keys *
输出:
(empty list or set)
keys * 用于列出当前 Redis 中所有的 key。返回空是正常现象------尚未存入任何数据。Redis 是 key-value 结构数据库,所有数据都以键值对形式存在。
停止服务
前台启动模式下,停止服务最直接的方式是在 redis-server 所在终端按下:
bash
Ctrl + C
这与终止其他前台进程的方式一致。但在生产环境中不会这样做,因为前台运行本身就不符合要求。
前台运行的问题
#mermaid-svg-W7Xm3FYyZ1tsOH6F{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .error-icon{fill:#552222;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .marker.cross{stroke:#333333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F p{margin:0;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster-label text{fill:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster-label span{color:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster-label span p{background-color:transparent;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .label text,#mermaid-svg-W7Xm3FYyZ1tsOH6F span{fill:#333;color:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .node rect,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node circle,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node ellipse,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node polygon,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .rough-node .label text,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node .label text,#mermaid-svg-W7Xm3FYyZ1tsOH6F .image-shape .label,#mermaid-svg-W7Xm3FYyZ1tsOH6F .icon-shape .label{text-anchor:middle;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .rough-node .label,#mermaid-svg-W7Xm3FYyZ1tsOH6F .node .label,#mermaid-svg-W7Xm3FYyZ1tsOH6F .image-shape .label,#mermaid-svg-W7Xm3FYyZ1tsOH6F .icon-shape .label{text-align:center;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .node.clickable{cursor:pointer;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .arrowheadPath{fill:#333333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-W7Xm3FYyZ1tsOH6F .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W7Xm3FYyZ1tsOH6F .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster text{fill:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .cluster span{color:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-W7Xm3FYyZ1tsOH6F rect.text{fill:none;stroke-width:0;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .icon-shape,#mermaid-svg-W7Xm3FYyZ1tsOH6F .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .icon-shape p,#mermaid-svg-W7Xm3FYyZ1tsOH6F .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .icon-shape .label rect,#mermaid-svg-W7Xm3FYyZ1tsOH6F .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W7Xm3FYyZ1tsOH6F .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-W7Xm3FYyZ1tsOH6F .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-W7Xm3FYyZ1tsOH6F :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ./redis-server 前台启动
终端被独占
无法执行其他命令
必须新开终端才能操作客户端
关闭终端即终止服务
改造:daemonize yes
前台启动(大屏方式)的缺陷与 java -jar 启动 Spring Boot 完全一致:
- 光标持续闪烁,终端被独占
- 必须另开窗口才能执行其他命令
- 终端关闭则服务终止
Redis 通过配置文件中的 daemonize 项解决此问题,作用等价于 nohup ... & 组合。
daemonize 后台化改造
定位配置项
redis.conf 配置文件内容非常庞大,逐行查找效率极低,应使用 vim 的搜索功能。
bash
cd /usr/local/redis-4.0.0
vim redis.conf
在命令模式 下输入 / 加关键字进行搜索:
bash
/daemonize
按回车后光标直接定位到匹配行,按 n 可跳到下一个匹配。
修改配置
默认配置:
bash
daemonize no
no 表示前台运行。按 i 进入插入模式,改为:
bash
daemonize yes
按 ESC 回到命令模式,输入 :wq 保存退出。
| 取值 | 行为 |
|---|---|
no |
前台运行,占用终端(默认值) |
yes |
后台守护进程方式运行,释放终端 |
顺带查看端口配置
同样使用搜索定位端口配置:
bash
/6379
可看到:
bash
port 6379
这正是启动时日志中 Port: 6379 的来源。一般不建议修改默认端口,但需知道配置位置。
启动时指定配置文件
关键 :修改 redis.conf 后,必须让 redis-server 显式加载该配置文件,改动才会生效。
bash
# 当前位于 redis-4.0.0 根目录
cd /usr/local/redis-4.0.0
# 指定配置文件启动(注意相对路径的层级关系)
src/redis-server ./redis.conf
这里的路径关系需要理清:
| 路径片段 | 含义 |
|---|---|
src/redis-server |
服务端程序,位于 src 子目录 |
./redis.conf |
配置文件,位于当前目录(即 redis-4.0.0 根目录) |
注意 :相对路径是相对于当前工作目录 解析的,而非相对于程序所在目录。若在
src目录下执行,则应写./redis-server ../redis.conf。
配置生效后的表现:
- 终端不再被日志刷屏,立即返回命令提示符
- 可直接在本窗口执行其他命令
- 客户端连接方式完全不变,
keys *仍可正常执行
#mermaid-svg-PaGXlKrXD5ZfWZ4P{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .error-icon{fill:#552222;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .marker.cross{stroke:#333333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P p{margin:0;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster-label text{fill:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster-label span{color:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster-label span p{background-color:transparent;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .label text,#mermaid-svg-PaGXlKrXD5ZfWZ4P span{fill:#333;color:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .node rect,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node circle,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node ellipse,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node polygon,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .rough-node .label text,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node .label text,#mermaid-svg-PaGXlKrXD5ZfWZ4P .image-shape .label,#mermaid-svg-PaGXlKrXD5ZfWZ4P .icon-shape .label{text-anchor:middle;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .rough-node .label,#mermaid-svg-PaGXlKrXD5ZfWZ4P .node .label,#mermaid-svg-PaGXlKrXD5ZfWZ4P .image-shape .label,#mermaid-svg-PaGXlKrXD5ZfWZ4P .icon-shape .label{text-align:center;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .node.clickable{cursor:pointer;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .arrowheadPath{fill:#333333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PaGXlKrXD5ZfWZ4P .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PaGXlKrXD5ZfWZ4P .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster text{fill:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .cluster span{color:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PaGXlKrXD5ZfWZ4P rect.text{fill:none;stroke-width:0;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .icon-shape,#mermaid-svg-PaGXlKrXD5ZfWZ4P .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .icon-shape p,#mermaid-svg-PaGXlKrXD5ZfWZ4P .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .icon-shape .label rect,#mermaid-svg-PaGXlKrXD5ZfWZ4P .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PaGXlKrXD5ZfWZ4P .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PaGXlKrXD5ZfWZ4P .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PaGXlKrXD5ZfWZ4P :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 未指定配置文件
src/redis-server
使用内置默认配置
daemonize = no
前台运行
指定配置文件
src/redis-server ./redis.conf
加载 redis.conf
daemonize = yes
后台运行
Windows 平台启停
Windows 下无需命令行,双击即可。
| 操作 | 动作 |
|---|---|
| 启动服务 | 双击 redis-server.exe |
| 打开客户端 | 双击 redis-cli.exe |
| 执行命令 | 在客户端窗口输入 keys * |
双击 redis-server.exe 后输出的日志与 Linux 下基本一致,端口同为 6379。若系统弹出网络访问询问,需点击「允许访问」。
Windows 版同样可指定配置文件启动,需打开命令行执行:
redis-server.exe redis.windows.conf
完整流程时序
redis.conf redis-cli redis-server 运维人员 redis.conf redis-cli redis-server 运维人员 #mermaid-svg-2350ed8HnENPc1N0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2350ed8HnENPc1N0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2350ed8HnENPc1N0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2350ed8HnENPc1N0 .error-icon{fill:#552222;}#mermaid-svg-2350ed8HnENPc1N0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2350ed8HnENPc1N0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2350ed8HnENPc1N0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2350ed8HnENPc1N0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2350ed8HnENPc1N0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2350ed8HnENPc1N0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2350ed8HnENPc1N0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2350ed8HnENPc1N0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2350ed8HnENPc1N0 .marker.cross{stroke:#333333;}#mermaid-svg-2350ed8HnENPc1N0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2350ed8HnENPc1N0 p{margin:0;}#mermaid-svg-2350ed8HnENPc1N0 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2350ed8HnENPc1N0 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-2350ed8HnENPc1N0 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2350ed8HnENPc1N0 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-2350ed8HnENPc1N0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-2350ed8HnENPc1N0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-2350ed8HnENPc1N0 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-2350ed8HnENPc1N0 .sequenceNumber{fill:white;}#mermaid-svg-2350ed8HnENPc1N0 #sequencenumber{fill:#333;}#mermaid-svg-2350ed8HnENPc1N0 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-2350ed8HnENPc1N0 .messageText{fill:#333;stroke:none;}#mermaid-svg-2350ed8HnENPc1N0 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2350ed8HnENPc1N0 .labelText,#mermaid-svg-2350ed8HnENPc1N0 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-2350ed8HnENPc1N0 .loopText,#mermaid-svg-2350ed8HnENPc1N0 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-2350ed8HnENPc1N0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-2350ed8HnENPc1N0 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-2350ed8HnENPc1N0 .noteText,#mermaid-svg-2350ed8HnENPc1N0 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-2350ed8HnENPc1N0 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2350ed8HnENPc1N0 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2350ed8HnENPc1N0 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-2350ed8HnENPc1N0 .actorPopupMenu{position:absolute;}#mermaid-svg-2350ed8HnENPc1N0 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-2350ed8HnENPc1N0 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-2350ed8HnENPc1N0 .actor-man circle,#mermaid-svg-2350ed8HnENPc1N0 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-2350ed8HnENPc1N0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 终端被独占 ./redis-server(前台启动) 输出日志 Port 6379 / PID 新开终端执行 ./redis-cli 127.0.0.1:6379> keys * (empty list or set) Ctrl + C 停止服务 vim redis.conf 修改 daemonize yes src/redis-server ./redis.conf 后台运行,终端释放 ./redis-cli 连接 正常响应
完整可运行代码
Redis 启停管理脚本
bash
#!/bin/bash
# ============================================================
# 功能:Redis 服务启停管理
# 用法:./redis_ctl.sh start | stop | restart | status | cli
# 说明:依赖 redis.conf 中 daemonize=yes,否则 stop 后仍会残留进程
# ============================================================
REDIS_HOME="/usr/local/redis-4.0.0"
REDIS_SERVER="${REDIS_HOME}/src/redis-server"
REDIS_CLI="${REDIS_HOME}/src/redis-cli"
REDIS_CONF="${REDIS_HOME}/redis.conf"
REDIS_PASSWORD="123456"
get_pid() {
ps -ef | grep "redis-server" | grep -v grep | awk '{print $2}'
}
start() {
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "Redis 已在运行,进程号:${PID}"
return 0
fi
echo "启动 Redis 服务,加载配置:${REDIS_CONF}"
cd "${REDIS_HOME}" || exit 1
"${REDIS_SERVER}" "${REDIS_CONF}"
sleep 1
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "Redis 启动成功,进程号:${PID}"
else
echo "Redis 启动失败,请检查配置文件"
exit 1
fi
}
stop() {
PID=$(get_pid)
if [ -z "${PID}" ]; then
echo "Redis 未在运行"
return 0
fi
echo "停止 Redis,进程号:${PID}"
# 优先使用 redis-cli shutdown,保证数据正常落盘
"${REDIS_CLI}" -a "${REDIS_PASSWORD}" shutdown nosave 2>/dev/null
sleep 2
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "优雅关闭未生效,强制终止 ${PID}"
kill -9 "${PID}"
else
echo "Redis 已停止"
fi
}
status() {
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "Redis 运行中,进程号:${PID}"
"${REDIS_CLI}" -a "${REDIS_PASSWORD}" ping 2>/dev/null
else
echo "Redis 未运行"
fi
}
cli() {
"${REDIS_CLI}" -a "${REDIS_PASSWORD}"
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; sleep 1; start ;;
status) status ;;
cli) cli ;;
*)
echo "用法:$0 {start|stop|restart|status|cli}"
exit 1
;;
esac
Spring Boot 中验证 Redis 连通性
java
package com.itheima.test;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import java.util.Set;
/**
* 验证 Redis 服务启动与后台运行配置是否生效。
* 需先确保 redis.conf 中 daemonize=yes 且服务已带配置文件启动。
*/
@SpringBootTest
public class RedisStartupTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 使用 RedisTemplate 写入并读取字符串,同时列出全部 key。
*/
@Test
public void testStartup() {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set("startup:test", "hello redis");
Object value = operations.get("startup:test");
System.out.println("读取到的值:" + value);
Set<String> keys = redisTemplate.keys("*");
System.out.println("当前全部 key:" + keys);
redisTemplate.delete("startup:test");
}
}
对应配置:
yaml
spring:
redis:
host: 192.168.138.100
port: 6379
# 未设置密码时该行可省略
password: 123456
database: 0
API 速览
| 命令 / 配置项 | 作用 | 关键参数 |
|---|---|---|
./redis-server |
前台启动 Redis 服务 |
可后接配置文件路径 |
./redis-server ./redis.conf |
按指定配置启动 | 配置文件路径 |
./redis-cli |
连接本地 Redis 服务 |
-h 主机、-p 端口、-a 密码 |
keys * |
列出所有 key |
* 为通配符 |
daemonize |
是否以守护进程方式运行 | no 前台 / yes 后台 |
port |
服务监听端口 | 默认 6379 |
Ctrl + C |
终止前台进程 | 无 |
vim /关键字 |
在命令模式下搜索关键字 | n 跳下一处 |
redis-cli shutdown |
优雅关闭服务 | nosave 不持久化 |
ping |
连通性探测,返回 PONG |
无 |
官方文档
- Redis 配置说明:https://redis.io/docs/manual/config/
- redis.conf 4.0 官方示例:https://raw.githubusercontent.com/redis/redis/4.0/redis.conf
- Redis 命令行客户端:https://redis.io/docs/ui/cli/
- Redis 管理命令:https://redis.io/commands/server/
总结
本文走完了 Redis 服务「启动---连接---停止---后台化」的完整闭环。核心认知有两点:其一,直接执行 redis-server 走的是内置默认配置,属于前台运行,会独占终端且随终端关闭而终止;其二,所有运行期行为都由 redis.conf 决定,把 daemonize 由 no 改为 yes 后,必须在启动时显式把配置文件路径传给 redis-server ,src/redis-server ./redis.conf,否则配置不生效。路径相对当前工作目录解析,这一细节是配置不生效的常见原因。