Java 接入Redis: 服务启动停止与后台运行配置

前台启动、客户端连接与daemonize后台化改造

纲要

本文解决 Redis 装好之后「怎么跑起来」的问题:从最朴素的前台启动,到发现它霸占终端的缺陷,最终通过 redis.confdaemonize 配置将其转为后台守护进程。

  • 启动服务
    • 执行 src/redis-server 前台启动
    • 启动日志解读:默认端口 6379、进程 ID
  • 客户端连接
    • src/redis-cli 连接本地服务
    • keys * 查看已有键
  • 停止服务
    • 前台模式下 Ctrl + C 终止
  • 后台化改造
    • vim/关键字 搜索技巧
    • daemonize no 改为 yes
    • 启动时显式指定配置文件
  • Windows 平台
    • 双击 redis-server.exeredis-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-clicliclient 的缩写。

重要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。返回空是正常现象------尚未存入任何数据。Rediskey-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 服务「启动---连接---停止---后台化」的完整闭环。核心认知有两点:其一,直接执行 redis-server 走的是内置默认配置,属于前台运行,会独占终端且随终端关闭而终止;其二,所有运行期行为都由 redis.conf 决定,把 daemonizeno 改为 yes 后,必须在启动时显式把配置文件路径传给 redis-serversrc/redis-server ./redis.conf,否则配置不生效。路径相对当前工作目录解析,这一细节是配置不生效的常见原因。

相关推荐
此时不提桶,更待何时1 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
鹿角片ljp3 小时前
KV Cache 解析
java·算法
captain3763 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
EasyGBS4 小时前
终结训推割裂!EasyGBS×EasyAIS×DLTM,实现AI算法训推一体闭环落地!
服务器·深度学习·安全
惊讶的猫4 小时前
意图识别置信度和检索重排的分数
java
caoerzhong4 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN5 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Doris__HE5 小时前
【元脑服务器NF5476G7-NF5476M7技术规格分享】
运维·服务器·网络·数据库·性能优化