- 若文章内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系博主删除。
 
- 本人写这篇博客旨在制作学习笔记,巩固知识。同时方便个人在线阅览,回顾知识。
 - 这篇博客中主要参考了【瑞吉外卖项目】视频中的内容,略有增删。
 
- 推荐博客
- 本人于 2022 年 4 月 7 日发布过的博客:《Centos7 的下载安装》。
 
 
文章目录
- 前言
 - 0.总目录链接
 - 1.Linux 简介
 - 
- 1.1.不同应用领域的主流操作系统
 - 1.2.Linux 发展历史
 - 1.3.Linux 系统版本
 
 - 2.Linux 安装
 - 
- 2.1.安装方式
 - 2.2.安装 Linux
 - 2.3.网卡设置
 - 2.4.安装 SSH 连接工具
 - 2.5.使用 FinalShell 连接到 Linux
 - 2.6.Linux 和 Windows 目录结构对比
 - 2.7.Linux 目录介绍
 
 - 3.Linux 常用命令
 - 
- 3.1.Linux 命令初体验
 - 
- 3.1.1.几个常用命令
 - 3.1.2.注意事项
 - 3.1.3.使用技巧
 - 3.1.4.命令格式
 
 - 3.2.文件目录操作命令
 - 
- 3.2.1.ls
 - 3.2.2.cd
 - 3.2.3.cat
 - 3.2.4.more
 - 3.2.5.tail
 - 3.2.6.mkdir
 - 3.2.7.rmdir
 - 3.2.8.rm
 
 - 3.3.拷贝移动命令
 - 
- 3.3.1.cp
 - 3.3.2.mv
 
 - 3.4.打包压缩命令 tar
 - 3.5.文本编辑命令
 - 
- 3.5.1.vi
 - 3.5.2.vim
 
 - 3.6.查找命令
 - 
- 3.6.1.find
 - 3.6.2.grep
 
 
 - 4.Linux 软件安装
 - 
- 4.1.软件安装方式
 - 4.2.安装 JDK
 - 4.3.有关防火墙的操作
 - 4.4.安装 Tomcat
 - 4.5.安装 MySQL
 - 4.6.安装 lrzsz
 
 - 5.Linx 中的项目部署
 - 
- 5.1.手工部署项目
 - 5.2.通过 Shell 脚本自动部署项目
 
 - 6.Redis 基础
 - 
- 6.1.Redis 入门
 - 
- 6.1.1.Redis 简介
 - 6.1.2.Redis 的下载与安装
 - 6.1.3.Redis 服务启动与停止
 - 6.1.4.Redis 设置密码
 - 6.1.5.Redis 设置远程连接
 
 - 6.2.数据类型
 - 6.3.常用命令
 - 
- 6.3.1.字符串 string 操作命令
 - 6.3.2.哈希 hash 操作命令
 - 6.3.3.列表 list 操作命令
 - 6.3.4.集合 set 操作命令
 - 6.3.5.有序集合 sorted set 操作命令
 - 6.3.6.通用命令
 
 
 - 7.在 Java 中操作 Redis
 - 
- 7.1.介绍
 - 7.2.在 Idea 中使用 Jedis
 - 7.3.Spring Data Redis
 - 
- 7.3.1.简单介绍
 - 7.3.2.项目准备工作
 - 7.3.3.string 类型数据操作
 - 7.3.4.hash 类型数据操作
 - 7.3.5.list 类型数据操作
 - 7.3.6.set 类型的数据操作
 - 7.3.7.zset 类型的数据操作
 - 7.3.8.通用的数据类型操作
 
 
 
前言
【瑞吉外卖】项目课程:Linux 学习
- 该课程在某站视频下的简介
 
- 【瑞吉外卖项目】 课程 以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。
 - 基于流行的 Spring Boot、MyBatis Plus 等技术框架进行开发,带领学习者体验真实项目开发流程、需求分析过程、代码实现过程。
 - 学完本课程可以锻炼需求分析能力、编码能力、bug 调试能力,增长开发经验。
 
- 黑马瑞吉外卖实战项目的相关链接
 
- 在线观看:https://www.bilibili.com/video/BV13a411q753
 - 百度网盘链接:https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA
 - 提取码:1234
 - 阿里云盘链接:https://www.aliyundrive.com/s/DS2XMVojBjH
 
官方所给的资料链接中是没有视频中出现的 PPT 的,本博客的主要内容就是摘抄自其视频中出现的 PPT 内容。
- Linux 部分的教学视频:P117 ~ P140
 - Redis 部分的教学视频:P141 ~ P154
 
0.总目录链接
- 【瑞吉外卖】Java 项目总目录:https://blog.csdn.net/yanzhaohanwei/article/details/125236345
 

1.Linux 简介
1.1.不同应用领域的主流操作系统
- 桌面操作系统
 - 服务器操作系统
 - 移动设备操作
 - 系统嵌入式操作系统
 
- 桌面操作系统
- Windows(用户数量最多)
 - Mac OS(操作体验好,办公人士首选)
 - Linux(用户数量少)
 
 
- 服务器操作系统
- UNIX(安全、稳定、付费)
 - Linux(安全、稳定、免费的版本很多、占有率高)
 - Windows Server(付费、占有率低)
 
 
- 移动设备操作
- Android(基于 Linux、开源。主要用于智能手机、平板电脑和智能电视)
 - iOS(苹果公司开发、不开源,用于苹果公司的产品,诸如 iphone、iPad)
 
 
- 系统嵌入式操作系统
- Linux(机顶盒、路由器、交换机)
 
 
1.2.Linux 发展历史
- 时间:1991年
 - 地点:芬兰赫尔辛基大学
 - 人物:Linus Torvalds ( 21岁)
 - 语言:C语言、汇编语言
 - logo:企鹅
 - 特点:免费、开源、多用户、多任务
 

1.3.Linux 系统版本
- 内核版
- 由 Linus Torvalds 及其团队开发维护
 - 免费且开源
 - 复制控制硬件
 
 
- 发行版
- 基于 Linux 内核进行拓展
 - 由各个 Linux 产商开发、维护
 - 有收费版本,也有免费版本
 
 
- Linux 系统发行版
- Ubuntu:以桌面应用为主
 - RedHat:应用最为广泛
 - CentOS:RedHat 的社区版 ,免费
 - openSUSE:对个人完全免费、图形界面华丽
 - Fedora:功能完备、快速更新、免费
 - 红旗 Linux:北京中科红旗软件技术有限公司开发
 
 

- 本次课程的操作使用的 LInux 的发行版就是 CentOS。
 
2.Linux 安装
- 本人在 2022 年 4 月 7 日发布过的博客《Centos7 的下载安装》有着详细的介绍。
 
2.1.安装方式
- Linux 系统的安装方式
- 物理机安装:直接将操作系统安装到服务器硬件上
 - 虚拟机安装:通过虚拟机软件安装
- 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的计算机系统。
 - 常用的虚拟机软件:VMware、VirtualBox、VMLite WorkStation、Qemu、HopeddotVOS。
 
 
 
- 课程中使用的虚拟机软件是 VMware。
 
2.2.安装 Linux
- 资料链接:https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA(提取码:1234 )
 


- 我们只需要点击 VMware 软件的安装程序,根据提示完成安装即可,非常简答。
 - 之后我们可以使用资料中提供的 CentOS 的镜像文件来完成安装。
 - 安装的具体细节可见我之前写过的博客:《Centos7的下载安装》
 
2.3.网卡设置
- 按照我之前写过的博客(Centos7的下载安装)中的操作来的话,是不会发生以下的情况的。
 
如果诸位在启动服务器时未加载网卡,则会导致 IP 地址初始化失败。
可以采用以下的方式来解决。
- 首先使用 
ip addr来查看服务器的 ip 地址。 

- 修改网络初始化配置,设定网卡在系统启动时初始化。
 
cd / # 进入根目录
cd etc # 进入 etc 目录
cd sysconfig # 进入 sysconfig 目录
cd network-scripts # 进入 network-scripts
vi ifcfg-ens33 # 编辑 ifcfg-en33 文件
- 这里补充一下关于 vi 的按键操作
- 按 
<i>键,进入光标状态。 - 移动光标,找到要修改的部分,再修改内容。
 - 按 
<ESC>键,退出光标状态。 - 再敲 
:wq--> 最后按<Enter>键,成功保存退出 
 - 按 
 

可以看到 BOOTPROTO=dhcp ,ONBOOT=no。我们把其改为 ONBOOT=yes 就行。
- ONBOOT 是指明在系统启动时是否激活网卡,只有在激活状态的网卡才能去连接网络,进行网络通讯。
 
之后重启虚拟机即可。
2.4.安装 SSH 连接工具
- SSH (Secure Shell),建立在应用层基础上的安全协议。
 
- 常用的 SSH 连接工具
- putty
 - secureCRT
 - xshell
 - finalshell
 
 
- 通过 SSH 连接工具就可以实现从本地连接到远程的 Linux 服务器。
 
2.5.使用 FinalShell 连接到 Linux
- 课程中使用的软件时 FinalShell,资料中也都有提供。
 - 直接按照提示安装就行,非常简单。
 
安装好 finalshell 之后,如下图操作即可。

这里输入我们之前查到的 ip 地址。

最后单击一下这个就行。

连接成功。

2.6.Linux 和 Windows 目录结构对比
- Linux系统中的目录
/是所有目录的顶点- 目录结构像一颗倒挂的树
 
 

2.7.Linux 目录介绍
- bin 存放二进制可执行文件
 - boot 存放系统引导时使用的各种文件
 - dev 存放设备文件
 - etc 存放系统配置文件
 - home 存放系统用户的文件
 - lib 存放程序运行所需的共享库和内核模块
 - opt 额外安装的可选应用程序包所放置的位置
 - root 超级用户目录
 - sbin 存放二进制可执行文件,只有 root 用户才能访问
 - tmp 存放临时文件
 - usr 存放系统应用程序
 - var 存放运行时需要改变数据的文件,例如日志文件
 

3.Linux 常用命令
3.1.Linux 命令初体验
3.1.1.几个常用命令
| 序号 | 命令 | 对应英文 | 作用 | 
|---|---|---|---|
| 1 | ls | 
list | 查看当前目录下内容 | 
| 2 | pwd | 
print work directory | 查看当前目录 | 
| 3 | cd [目录名] | 
change directory | 切换目录 | 
| 4 | touch [文件名] | 
touch | 若文件不存在,则新建文件 | 
| 5 | mkdir | 
make directory | 创建目录 | 
| 6 | rm [文件名] | 
remove | 删除指定文件 | 
3.1.2.注意事项
在执行 Linux 命令时,若提示信息显示为乱码,一般多为编码问题导致。
只需要修改 Linux 的编码即可
- 把 
'LANG="en_us.UTF-8"'追加到/etc/profile中去。 
echo 'LANG="en_us.UTF-8"' >> /etc/profile
- 重新加载配置文件,使得新增的配置生效
 
source /etc/profile
3.1.3.使用技巧
- Tab 键自动补全
 - 连续两次 Tab 键,给出操作提示
 - 使用上下箭头快速调出曾经使用过的命令
 - 使用 clear 命令或者 Ctrl + l 快捷键实现清屏
 
3.1.4.命令格式
command [-options] [parameter]
命令格式的说明
command:命令名[-options]:选项,可用来对命令进行控制,也可以省略[parameter]:传给命令的参数,可以是零个、一个或者多个- 其中 
[]代表可选,且命令名 ,选项 ,参数之间需用空格进行分隔 
3.2.文件目录操作命令
3.2.1.ls
- 作用:显示指定目录下的内容
 - 语法:
ls [-al] [dir] - 说明
-a显示所有文件及目录(像.文件名这样的 隐藏文件 也会列出)-l除文件名称外,同时将文件型态(d 表示目录,-表示文件)、权限、拥有者、文件大小等信息详细列出
 - 注意:由于我们使用 ls 命令时经常需要加入 
-l选项,所以 Linux 为ls -l命令提供了一种简写方式,即ll 

3.2.2.cd
- 作用:用于切换当前工作目录,即进入指定目录
 - 语法:
cd [dirName] - 特殊说明
~表示当前用户的 home 目录- 不同用户的 home 目录可能不同,Linux 中的 root 用户的 home 目录即为 
/root 
- 不同用户的 home 目录可能不同,Linux 中的 root 用户的 home 目录即为 
 .表示目前所在的目录..表示目前目录位置的上级目录
 - 举例
cd ..:切换到当前目录的上级目录cd ~:切换到用户的 home 目录cd /usr/local: 切换到/usr/local目录
 
3.2.3.cat
- 作用:用于显示文件内容
 - 语法:
cat [-n] filaName - 说明: 
-n表示由 1 开始对所有输出行数编号 - 举例:
cat /etc/profile查看/etc目录下的 profile 文件内容 
3.2.4.more
- 作用:以分页的形式显示文件内容
 - 语法:
more fileName - 操作说明:
- 回车键:向下滚动一行
 - 空格键:向下滚动一屏
 - b:返回上一屏
 - q 或者 Ctrl + C:退出 more
 
 - 举例:
more /etc/profile:以分页方式显示/etc目录下的 profile 文件内容 
3.2.5.tail
- 作用:查看文件末尾的内容
 - 语法:
tail [-f] fileName - 说明
-f:动态读取文件末尾内容并显示,通常用于日志文件的内容输出
 - 举例
tail /etc/profile:显示/etc目录下的 profile 文件末尾 10 行的内容tail -20 /etc/profile:显示/etc目录下的 profile 文件末尾 20 行的内容tail -f /itcast/my.log:动态读取/itcast目录下的 my.log 文件末尾内容并显示
 - 操作说明
tail [-f] fileName动态读取时会霸屏,使用 Ctrl + C 退出即可。
 
3.2.6.mkdir
- 作用:创建目录
 - 语法:
mkdir [-p] dirName - 说明
-p:确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建。
 - 举例
 mkdir itcast:在当前目录下,建立一个名为 itcast 的子目录mkdir-p itcast/test- 在工作目录下的 itcast 目录中建立一个名为 test 的子目录,若 itcast 目录不存在,则建立一个
 
3.2.7.rmdir
- 作用:删除空目录
 - 语法:
rmdir [-p] dirName - 说明
-p:当子目录被删除后使父目录为空目录的话,则一并删除
 - 举例
 rmdir itcast:删除名为 itcast 的空目录rmdir-p itcast/test- 删除 itcast 目录中名为 test 的子目录。若 test 目录删除后 itcast 目录变为空目录,则也被删除
 
rmdir itcast:删除名称以 itcast 开始的空目录
3.2.8.rm
- 作用:删除文件或者目录
 - 语法:
rm [-rf] name - 说明
-r:将目录及目录中所有文件(目录)逐一删除,即递归删-f:无需确认,直接删除
 - 举例
rm -r itcast/:删除名为 itcast 的目录和目录中所有文件,删除前需确认rm -rf itcast/:无需确认,直接删除名为 itcast 的目录和目录中所有文件rm -f hello.txt:无需确认,直接删除 hello.txt 文件
 
3.3.拷贝移动命令
3.3.1.cp
- 作用:用于复制文件或目录
 - 语法:
cp [-r] source dest - 说明
-r:如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
 - 举例
cp hello.txt itcast/:将 hello.txt 复制到 itcast 目录中cp hello.txt ./hi.txt:将 hello.txt 复制到当前目录,并改名为 hi.txtcp -r itcast/ ./itheimal:将 itcast 目录和目录下所有文件复制到 itheima 目录下cp -r itcast/* ./ itheima/:将 itcast 目录下所有文件复制到 itheima 目录下
 
3.3.2.mv
- 作用:为文件或目录改名、或将文件或目录移动到其它位置
 - 语法:
mv source dest - 举例
mv hello.txt hi.txt:将 hello.txt 改名为 hi.txtmv hi.txt itheima/:将文件 hi.txt 移动到 itheima 目录中mv hi.txt itheima/ hello.txt:将 hi.txt 移动到 itheima 目录中,并改名为 hello.txtmv itcast/ itheima/:如果 itheima 目录不存在,将 itcast 目录改名为 itheimamv itcast/ itheima/:如果 itheima 目录存在,将 itcast 目录移动到 itheima 目录中
 
3.4.打包压缩命令 tar
- 作用:对文件进行打包、解包、压缩、解压
 - 语法:
tar [-zcxvf] fileName [files]- 包文件后缀为 
.tar表示只是完成了打包,并没有压缩 - 包文件后缀为 
.tar.gz表示打包的同时还进行了压缩 
 - 包文件后缀为 
 - 说明
-z:z 代表的是 gzip,通过 gzip 命令处理文件(gzip 可以对文件压缩或者解压)-c:c 代表的是 create,即创建新的包文件-x:x 代表的是 extract,实现从包文件中还原文件-v:v 代表的是 verbose,显示命令的执行过程-f:f 代表的是 file,用于指定包文件的名称
 - 举例
- 打包
tar -cvf hello.tar ./*:将当前目录下所有文件打包,打包后的文件名为 hello.tartar -zcvf hello.tar.gz ./*:将当前目录下所有文件打包并压缩,打包后的文件名为 hello.tar.gz
 - 解包
tar -xvf hello.tar:将 hello.tar 文件进行解包,并将解包后的文件放在当前目录tar -zxvf hello.tar.gz:将 hello.tar.gz 文件进行解压,并将解压后的文件放在当前目录tar -zxvf hello.tar.gz -C /usr/local:将 hello.tar.gz 文件进行解压,并将解压后的文件放在/usr/local目录
 
 - 打包
 
3.5.文本编辑命令
3.5.1.vi
- 作用:vi 命令是 Linux 系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于 Windows 中的记事本
 - 语法:
vi fileName 
3.5.2.vim
- 作用:对文件内容进行编辑,vim 其实就是一个文本编辑器
 - 语法:
vim fileName - 说明
- vim 是从 vi 发展来的一个功能更加强大的文本编辑工具。
- 在编辑文件时可以对文本内容进行着色,方便我们对文件进行编辑处理,故实际工作中 vim 更加常用。
 
 - 要使用 vim 命令,需要我们自己完成安装。可以使用该命令来完成安装:
yum install vim - 在使用 vim 命令编辑文件时,如果指定的文件存在则直接打开此文件。如果指定的文件不存在则新建文件。
 - vim 在进行文本编辑时共分为三种模式
- 命令模式(Command mode)、插入模式(Insert mode)、底行模式(Last line mode)。
 - 这三种模式之间可以相互切换。我们在使用 vim 时一定要注意我们当前所处的是哪种模式
 
 
 - vim 是从 vi 发展来的一个功能更加强大的文本编辑工具。
 
- 针对 vim 中的三种模式的说明
- 命令模式
- 命令模式下可以查看文件内容、移动光标(上下左右箭头、gg、G)
 - 通过 vim 命令打开文件后,默认进入命令模式
 - 另外两种模式需要首先进入命令模式,才能进入彼此
 
 - 插入模式
- 插入模式下可以对文件内容进行编辑
 - 在命令模式下按下 [
i,a,o] 任意一个,可以进入插入模式。- 进入插入模式后,下方会出现 INSERT 字样
 
 - 在插入模式下按下 ESC 键,回到命令模式
 
 - 底行模式
- 底行模式下可以通过命令对文件内容进行查找、显示行号、退出等操作
 - 在命令模式下按下[
:,/]任意一个,可以进入底行模式 - 通过 
/方式进入底行模式后,可以对文件内容进行查找 - 通过 
:方式进入底行模式后- 可以输入 wq(保存并退出)、q!(不保存退出)、 
set nu(使文件内容显示行号) 
 - 可以输入 wq(保存并退出)、q!(不保存退出)、 
 
 
 - 命令模式
 
3.6.查找命令
3.6.1.find
- 作用:在指定目录下查找文件
 - 语法:
find dirName -option fileName - 举例
find . -name "*.java":在当前目录及其子目录下查找.java结尾文件find /itcast -name "*.java":在/itcast目录及其子目录下查找.java结尾的文件
 
3.6.2.grep
- 作用:从指定文件中查找指定的文本内容
 - 语法:
grep word fileName - 举例
grep Hello Helloworld.java:查找 Helloworld.java 文件中出现的 Hello 字符串的位置grep hello *.java:查找当前目录中所有.java结尾的文件中包含 hello 字符串的位置
 
4.Linux 软件安装
注意:以下用到的相关软件的安装包都在下方的链接中。
- 资料链接:https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA(提取码:1234 )
 

其实我在之前写的博客也讲述了关于在 CentOS7 中下载安装 JDK1.8、MySQL5、Tomcat8、Redis 的具体操作。
不过具体操作和本篇博客(也就是相关的教学视频中的 PPT)约有出入。
因为本篇博客依旧是【瑞吉外卖】系列的一部分,自然还是以该系列中的教学为准。
4.1.软件安装方式
- 二进制发布包安装
- 软件已经针对具体平台编译打包发布,只要解压,修改配置即可
 
 - rpm 安装
- 软件已经按照 redhat 的包管理规范进行打包,使用 rpm 命令进行安装,不能自行解决库依赖问题
 
 - yum 安装
- 一种在线软件安装方式,本质上还是 rpm 安装,自动下载安装包并安装,安装过程中自动解决库依赖问题
 
 - 源码编译安装
- 软件以源码工程的形式发布,需要自己编译打包
 
 
4.2.安装 JDK
- 操作步骤
- 使用 FinalShell 自带的上传工具将 jdk 的二进制发布包上传到 Linux
- jdk-8u171-linux-×64.tar.gz
 
 - 解压安装包,命令为 
tar -zxvf jdk-8u171-linux-x64.tar.gz -C/usr/local - 配置环境变量,使用 vim 命令修改 
/etc/profile文件,在文件末尾加入如下配置JAVA_HOME=/usr/local/jdk1.8.0_171PATH=$JAVA_HOME/bin:$PATH
 - 重新加载 profile 文件,使更改的配置立即生效,命令为 
source /etc/profile - 检查安装是否成功,命令为 
java -version 
 - 使用 FinalShell 自带的上传工具将 jdk 的二进制发布包上传到 Linux
 

- 补充
 
事实上不少人下载的 CentOS7 是自带 openJDK 的。
这里还是提倡诸位先卸载 openJDK 再安装 JDK。
相关的具体操作还请见我之前写过的博客【CentOS7卸载openJDK,安装jdk1.8】
4.3.有关防火墙的操作
- CentOS 上 防火墙 的相关操作
- 查看防火墙状态:
systemctl status firewalld、firewall-cmd --state - 暂时关闭防火墙:
systemctl stop firewalld - 永久关闭防火墙:
systemctl disable firewalld - 开启防火墙:
systemctl start firewalld - 开放指定端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent - 关闭指定端口:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent - 立即生效:
firewall-cmd --reload - 查看开放的端口:
firewall-cmd --zone=public --list-ports 
 - 查看防火墙状态:
 
- 关于 防火墙 的相关注意事项
- systemctl 是管理 Linux 中服务的命令
- 可以对服务进行启动、停止、重启、查看状态等操作
 
 - firewall-cmd 是 Linux 中专门用于控制防火墙的命令
 - 为了保证系统安全,服务器的防火墙不建议关,一般只开放指定的端口
 
 - systemctl 是管理 Linux 中服务的命令
 
4.4.安装 Tomcat
- 操作步骤
- 使用 FinalShell 自带的上传工具将 Tomcat 的二进制发布包上传到 Linux
- apache-tomcat-7.0.57.tar.gz
 
 - 解压安装包,命令为 
tar -zxvf apache-tomcat-7.0.57.tar.gz -C /usr/local - 进入 Tomcat 的 bin 目录启动服务,命令为 
sh startup.sh或者./startup.sh 
 - 使用 FinalShell 自带的上传工具将 Tomcat 的二进制发布包上传到 Linux
 

- 验证
- 查看启动日志
more /usr/local/apache-tomcat-7.0.57/logs/catalina.outtail -50 /usr/local/apache-tomcat-7.0.57/logs/catalina.out
 - 查看进程:
ps -ef | grep tomcat - 注意
- ps 命令是 linux 下非常强大的进程查看命令,通过 
ps -ef可以查看当前运行的所有进程的详细信息 |在 Linux 中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入- 使用 ps 命令查看进程时,经常配合管道符和查找命令 grep 一起使用,来查看特定进程
 
 - ps 命令是 linux 下非常强大的进程查看命令,通过 
 
 - 查看启动日志
 
- 输入 
虚拟机IP地址:8080就可以正常访问到 Tomcat。 
但如果防火墙没有关的话就不行。

- 停止 Tomcat 服务的方式
- 运行 Tomcat 的 bin 目录中提供的停止服务的脚本文件 shutdown.sh
sh shutdown.sh./shutdown.sh
 - 或者我们可以直接结束 Tomcat 的进程
- 先查到 Tomcat 进程 id:
ps -ef | grep tomcat - 后执行 
kill -9 进程id- kill 命令是 Linux 提供的用于结束进程的命令,-9 表示强制结束
 
 
 - 先查到 Tomcat 进程 id:
 - 一般情况下还是建议使用第一种方式停止 Tomcat 的服务
 
 - 运行 Tomcat 的 bin 目录中提供的停止服务的脚本文件 shutdown.sh
 

4.5.安装 MySQL
本博客中的安装 MySQL 的操作是根据视频来写的。
安装过程我最近尝试了,又遇到了坑,下面也记录了解决办法。
若有兴趣的话,可以看看我之前写的博客中的【5.2.安装 MySQL】部分。
博客中的安装方式与视频有所不同。
操作步骤
- 检测当前系统中是否安装 MySQL 数据库
 - 卸载已经安装的冲突软件
 - 将资料中提供的 MySQL 安装包上传到 Linux 并解压
 - 按照顺序安装 rpm 软件包
 - 启动 MySQL
 - 登录 MySQL 数据库,查阅临时密码
 - 登录 MySQL,修改密码,开放访问权限
 - 测试 MySQL 数据库是否正常工作
 
- 检测当前系统中是否安装 MySQL 数据库
rpm -qa:查询当前系统中安装的所有软件rpm -qa | grep mysql:查询当前系统中安装的名称带 mysql 的软件rpm -qa | grep mariadb:查询当前系统中安装的名称带 mariadb 的软件
 
- RPM(Red-Hat Package Manager)
- RPM 软件包管理器,是红帽 Linux 用于管理和安装软件的工具
 
 
- 注意
- 如果当前系统中已经安装有 MySQL 数据库,安装将失败。
 - CentoS7 自带的 mariadb,与 MySQL 数据库冲突
 
 
- 卸载已经安装的冲突软件
rpm -e --nodeps 软件名称 卸载软件- 例如:
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 
 
- 将资料中提供的 MySQL 安装包上传到 Linux 并解压
mkdir /usr/local/mysqltar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql
 
- 解压后会得到 6 个 rpm 的安装包文件
 
mysq1-5.7.25-1.e17.x86_64.rpm-bundle.tar.gz
mysq1-community-c1ient-5.7.25-1.e17.x86_64.rpm
mysq1-community-common-5.7.25-1.e17.x86_64.rpm
mysq1-community-deve1-5.7.25-1.e17.x86_64.rpm
mysq1-cammunity-1ibs-5.7.25-1.e17.x86_64.rpm
mysq1-community-1ibs-compat-5.7.25-1.e17.x86_64.rpm
mysq1-community-server-5.7.25-1.e17.x86_64.rpm
- 按照顺序安装 rpm 软件包
rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpmrpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpmyum install libaioyum install net-toolsrpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm
 
- 说明 1:若安装过程中提示缺少 net-tools 依赖,使用 yum 安装
 - 说明 2:可以通过指令升级现有软件及系统内核:
yum update 
- 启动 MySQL
systemctl status mysqld:查看 MySQL 服务状态systemctl start mysqld:启动 MySQL服务systemctl enable mysqld:设置开机启动 MySQL 服务,避免每次手动开启服务netstat -tunlp:查看已经启动的服务netstat -tunlp | grep mysql:查看已经启动的服务中的 MySQL 服务ps -ef | grep mysql:查看 MySQL 进程
 
吐槽:我之前安装的 MySQL 的操作和之前视频是有所不同的,设置的参数是不同的。
我设置的软链接就是 mysql,命令不一定完全相同。
例如我这里的就是systemctl status mysql、systemctl start mysql

- 登录 MySQL 数据库,查阅临时密码
cat /var/log/mysqld.log:查看文件内容cat /var/log/mysqld.log | grep password:查看文件内容中包含 password 的行信息
 

注意:冒号后的就是密码,空格也算在内的。
- 登录 MySQL,修改密码,开放访问权限
mysql -urpot -p:登录 mysql(使用临时密码登录)- 修改密码
set global validate_password_length=4;:设置密码长度最低位数set global validate_password_policy=LOW;:设置密码安全等级低,便于密码可以修改成 rootset password = password('root');:设置密码为 root
 - 开启访问权限
grant all on *.* to 'root'@'%' identified by '远程连接时需要的认证密码,写啥数字英文都行';flush privileges;
 - 可以使用以下命令查看权限的开放情况
- 首先登录 MySQL,再 
use mysql;。 select user,host from user;select user,host,authentication_string from user;(如果你想看被加密过的密码的话)
 - 首先登录 MySQL,再 
 
 

- 报错:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 
因为后面的项目优化中,需要两台服务器,我就又装了一次 CentOS7。
这次是按照视频中操作来安装 MySQL 的。
使用临时密码登录时报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。
- 解决办法
- 先使用命令:
vim /etc/my.cnf,再在其中加入skip-grant-tables。 - 之后再重启服务,此时可以无密码登录。
 - 更改密码:
update mysql.user set authentication_string=password('新密码') where user='root';。 - 之后再 
flush privileges;刷新权限,退出 mysql 。 - 再次使用命令:
vim /etc/my.cnf,注释掉之前写的skip-grant-tables。 - 之后再次重启服务:
systemctl restart mysqld。 - 至此,使用新密码登录成功。
 - 之后如上的步骤说明,正常操作即可。
 
 - 先使用命令:
 
- 测试 MySQL 数据库是否正常工作
show databases;
 

之后再在本机上使用数据库图形化工具,点击 “测试连接”,看看能否成功。

4.6.安装 lrzsz
- Yum(全称为 Yellow dog Updater, Modified)
- Yum 是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。
 - Yum 基于 RPM 包管理
- 能够从指定的服务器自动下载 RPM 包并且安装。
 - 可以自动处理依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
 
 
 
- lrzsz 这个是用于 Linux 系统中文件的上传 / 下载的一个文件。
 
操作步骤
- 搜索 lrzsz 安装包,命令为 
yum list lrzsz - 使用 yum 命令在线安装,命令为 
yum install lrzsz.x86_64 
之后使用 rz 这个命令就可以打开相应的传送界面。

5.Linx 中的项目部署
5.1.手工部署项目
- 在 IDEA 中开发 SpringBoot 项目并打成 jar 包
 - 将 jar 包上传到 Linux 服务器
 - 检查防火墙,确保 8080 端口对外开放
 - 准备数据库的信息
 - 运行项目
 - 改为后台运行 SpringBoot 程序,并将日志输出到日志文件
 - 停止 SpringBoot 项目程序
 
- 在 IDEA 中开发 SpringBoot 项目并打成 jar 包
 
pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.4.5</version>
        </plugin>
    </plugins>
</build>
使用工具将项目打包

打包完成后,我们可以在 target 目录下找到相应的 jar 包

- 将 jar 包上传到 Linux 服务器
 
可以创建目录(mkdir /usr/local/app),将项目 jar 包放到此目录。
我这里使用的软件是 MobaXterm(不用 FinalShell 是因为用这个用习惯了)

- 检查防火墙,确保 8080 端口对外开放
 
开放指定端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent 
执行上面的命令后,若出现 sucess,须执行下面的命令使得开放的端口生效
firewall-cmd --reload
使用下面的命令查看开放的端口
firewall-cmd --zone=public --list-ports  # 如果再次进行查看
我这里图省事,直接关掉了整个防火墙,所以输出的信息是:FirewallD is not running。
- 准备数据库的信息
 
因为我这里是直接运行自己之前创建好的 reggie_takeout 项目,所以在此之前需要先创建好数据库。

之后可以要将之前 Windows 环境下的数据导出成 sql 文件,再把该文件传送到 Linux 系统下

比如我就是把该文件传送到了 /usr/local/app 的目录,然后 use reggie;,再 source /usr/local/app/reggie.sql ,就完成操作了。
mysql> use reggie;
Database changed
mysql> source /usr/local/app/reggie.sql

我是试过直接从 Windows 中朝数据库导入 sql 文件,但软件会报错,在 Linux 系统内部就没有问题。

- 运行项目
 
进入各位存放上述 jar 包的地址后,输入 java -jar reggie_take_out-1.0-SNAPSHOT.jar

在 Windows 系统(本机)上访问网页没有问题

- 真的到这里就没问题了吗?当然不是。
- 其实使用移动端界面时,要通过验证码登录。问题来了,这里的控制台不显示验证码 … …
 
 
- 改为后台运行 SpringBoot 程序,并将日志输出到日志文件
 
目前程序运行的问题
* 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
* 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
- nohup 命令:英文全称 no hang up(不挂起)
- 用于不挂断地运行指定命令,退出终端不会影响程序的运行。
 - 语法格式:
nohup Command [ Arg ...][&] - 参数说明
- command:要执行的命令
 - Arg:一些参数,可以指定输出文件
 - &:让命令在后台运行
 
 - 举例
nohup java -jar boot工程.jar &> hello.log &- 后台运行 java -jar 命令,并将日志输出到 hello.log 文件
- 此处的 log 文件是相对路径下的文件,会在我们执行该行命令的目录下生成这个 log 文件
 - 最后一个 & 表示在后台运行
 
 
 
 

- 停止 SpringBoot 项目程序
 
ps -ef | grep 'java -jar'
kill -9 相应的进程id

5.2.通过 Shell 脚本自动部署项目
执行步骤
- 在 Linux 中安装 Git
 - 使用 Git 克隆代码
 - 在 Linux 中安装 maven
 - 编写 Shell 脚本(拉取代码、编译、打包、启动)
 - 为用户授予执行 Shell 脚本的权限
 - 执行 Shell 脚本
 - 设置静态 IP
 - 重启网络服务
 

- 在 Linux 中安装 Git
 
列出 git 安装包
yum list git
在线安装 git
yum install git
- 使用 Git 克隆代码
 
cd /usr/local/
git clone https://gitee.com/ChuanZhiBoKe/helloworld.git
我自己这里当然是使用之前上传过的瑞吉外面的代码了:git clone https://github.com/JoJoStart/reggie_takeout
这里需要注意的是:上传的项目得是执行过打包操作的项目。
- 在 Linux 中安装 Maven
 
首先将资料中提供的 maven 安装包上传到 Linux,再于其中安装 maven
解包解压(假设 maven 安装包的位置是 /usr/local)
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local
修改配置文件:profile
vim /etc/profile
修改文件 profile 的内容如下
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
加载配置文件:profile
source /etc/profile
查看 Maven 版本
mvn -version
修改配置文件 settings.xml
vim /usr/local/apache-maven-3.5.4/conf/settings.xml
修改文件 settings.xml 内容如下(决定 maven 的本地仓库)
<localRepository>/usr/local/mavenRepo</localRepository>
- 编写 Shell 脚本(拉取代码、编译、打包、启动)
 
Shell 脚本(shell script),是一种 Linux 系统中的脚本程序。
使用 Shell 脚本编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。(跟 JavaScript、Java 编程一样)
对于 Shell 脚本的编写,是不作为本课程重点内容,直接使用课程资料中提供的脚本文件 bootStart.sh 即可。
- 为用户授予执行 Shell 脚本的权限
 
chmod(英文全拼: change mode)命令是控制用户对文件的权限的命令
Linux 中的权限分为:读(r)、写(w)、执行(x)三种权限
Linux 的文件调用权限分为三级︰文件所有者(Owner)、用户组(Group)、其它用户(Other Users)
只有文件的所有者和超级用户可以修改文件或目录的权限
要执行 Shell 脚本需要有对此脚本文件的执行权限,如果没有则不能执行

Chmod 命令可以使用八进制数来指定权限
| # | 权限 | rwx | 
|---|---|---|
| 7 | 读 + 写 + 执行 | rwx | 
| 6 | 读 + 写 | rw- | 
| 5 | 读 + 写 + 执行 | r-x | 
| 4 | 只读 | r-- | 
| 3 | 写 + 执行 | -wx | 
| 2 | 只写 | -w- | 
| 1 | 只执行 | --x | 
| 0 | 无 | --- | 
- 举例
chmod 777 bootStart.sh为所有用户授予读、写、执行权限chmod 755 bootStart.sh为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限chmod 210 bootstart.sh为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限
 
- 注意:三位数字分别代表不同用户的权限
- 第 1 位表示文件拥有者的权限
 - 第 2 位表示同组用户的权限
 - 第 3 位表示其他用户的权限
 
 
- 执行 Shell 脚本
 
进入目录 /usr/local/sh,使用命令:./bootStart.sh 即可。
相应的 bootStart.sh 的内容自己根据自己的实际需求自行更改。(说的都是人话,很容易改)
- 不过这里我遇到了几处问题,这里说一下。
- 一是日志打印(
/项目地址/reggie_takeout.log) :Unable to access jarfile reggie_takeout-1.0-SNAPSHOT.jar,程序跑不起来。- 究其原因是打包生成的文件是 
reggie_takeout-1.0-SNAPSHOT.jar,而 .sh 文件的是reggie_take_out-1.0-SNAPSHOT.jar。 - 修改一下内容即可。
 - 究其原因是 APP_NAME 和生成的 jar 包的名称要设为一致。
 
 - 究其原因是打包生成的文件是 
 - 二是图片显示有问题,找不到。
- 这个没什么好说的,就是之前写了过滤器,屏蔽掉了,把图片资源整到项目外面的目录就好了。
 - 当然,相应的配置文件也要改。
 
 
 - 一是日志打印(
 
- 设置静态 IP
 
修改文件 /etc/sysconfig/network-scripts/ifcfg-ens33
就上面的 ifcfg-ens33(网络设备的名称)而言,不同系统的名称并不是固定的。
可以自行去该目录 /etc/sysconfig/network-scripts/ 下查找。
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 使用静态IP地址,默认为 dhcp
IPADDR="192.168.138.100" # 设置的静态 IP 地址
NETMASK="255.255.255.0" # 子网掩码
GATEWAY="192.168.138.2" # 网关地址
DNS1="192.168.138. 2" # DNS 服务器
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes "
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="95b614cd-79b0-4755-be8d-99f1cca7271b"
DEVICE="ens33"
ONBOOT="yes" # 是否开机启用

使用动态 IP 的问题在于万一系统莫名挂了之后,动态 IP 发生变化,就需要输入新的 IP 地址。
为了安全(如果是上线的服务是不可能给用户动态获取 IP 这个权限的)和方便,是很有必要设置静态 IP 的。
- 重启网络服务
 
systemctl restart network
- 注意
- 重启完网络服务后 ip 地址已经发生了改变。
 - 此时 FinalShell 已经连接不上 Linux 系统,需要创建一个新连接才能连接到 Linux。
 
 
6.Redis 基础
Redis 是一个基于内存的 key-value 结构数据库。
- 基于内存存储,读写性能高
 - 适合存储热点数据(热点商品、资讯、新闻)
 - 企业应用广泛
 
6.1.Redis 入门
6.1.1.Redis 简介
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker.
翻译:Redis 是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
官网链接:https://redis.io
Redis 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到 100000+的 QPS。
QPS(Queries-per-second),每秒内查询次数。(百度百科)
它存储的 value 类型比较丰富,也被称为结构化的 NoSQL 数据库。
NoSQL(Not only SQL),不仅仅是 SQL,泛指非关系型数据库。
NoSQL 数据库并不是要取代关系型数据库,而是关系型数据库的补充。
- 关系型数据库(RDBMS)
- MySQL
 - Oracle
 - DB2
 - SQL Server
 
 
- 非关系型数据库(NoSQL)
- Redis
 - Mongo db
 - MemCached
 
 
- Redis 应用场景
- 缓存
 - 任务队列
 - 消息队列
 - 分布式锁
 
 
6.1.2.Redis 的下载与安装
- 下载
 
Redis 安装包分为 Windows 版和 Linux 版
Windows 版下载地址:https://github.com/microsoftarchive/redis/releases
Linux 版下载地址:https://download.redis.io/releases

Redis 提供的 Windows 版本 有两种:msi 为安装版本,zip 为绿色版的,一般使用 zip 即可。
视频中所用的是以下的两个版本。

- 在 Linux 系统安装 Redis 的步骤
- 将 Redis 安装包上传到 Linux
 - 解压安装包的命令:
tar -zxvf redis-4.0.0.tar.gz -C /usr/local - 安装 Redis 的依赖环境 gcc。命令:
yum install gcc-c++ - 进入 
/usr/local/redis-4.0.0,进行编译。命令:make - 进入redis 的 src 目录,进行安装。命令:
make install 
 
- Redis 的 Windows 版本属于绿色软件,直接解压即可使用,解压后目录结果如下
 

6.1.3.Redis 服务启动与停止
Linux 中 redis 服务启动,可以使用 redis-server,默认端口号:6379。
Linux中 redis 的客户端连接 redis 服务,直接使用 redis-cli 即可完成该操作。
其中 redis-server、redis-cli 的位置在 /src/ 的目录下。
使用命令:./redis-server 即可开启服务。

鉴于上面的服务的启动为霸屏模式,故打开新标签页,输入命令:./redis-cli。
如此可以打开 Redis 的客户端。

此时可以查看一下相关进程的情况:ps -ef | grep redis(当然,另外再次打开一个新标签页中输入该命令)

使用快捷键:Ctrl + C,可以停止 redis 服务。
Linux 系统中 redis 服务启动时为霸屏模式,为改变这种情况,需要更改配置文件(/usr/local/redis-4.0.0/redis.conf)
使用命令:vim redis.conf 打开文件后,使用 /dae 快速找到 daemonize 单词。
之后将 daemonize=no 改为 daemonize=yes 就行,此即更改为前台运行。

更改保存配置文件后,输入命令:src/redis-server ./redis.conf,使得其加载到配置文件。

显然,此时 redis 服务在后台运行。
在 Windows 系统中启动 Redis 是蛮简单的。
先双击 redis-server.exe 启动 Redis 服务,再双击 redis-cli.exe 打开客户端就行了。
其中 redis 的服务默认端口号是:6379。

但是我这里点击 redis-server.exe 时是直接闪退了。
直接在终端输入的时候,也是报错。

使用 redis-server.exe redis.windows.conf 这个命令启动服务即可。

6.1.4.Redis 设置密码
默认情况下,redis 没有开启密码校验。但是这种情况是非常不安全的。
在 Linux 系统中,需要修改 /usr/local/redis-4.0.0/redis.conf 文件。
把 # requirepass foobared 修改为 requirepass 你想设的密码 即可。

保存好修改后的文件,此时我们需要停止之前启动的 redis 进程,之后再开启 redis 进程,启动 redis.cli 即可。
可以使用 src/redis-cli -h localhost -p 6379 启动客户端,再在客户端内输入 auth 你设置的密码 使用 reids。
或者是直接一步到位:src/redis-cli -h localhost -p 6379 -a 你设的密码

在 Windows 系统中,需要修改 /usr/local/redis-4.0.0/redis.conf 文件来设置密码。
过程与之前在 Linux 系统中的操作无异,这里不再赘述。
6.1.5.Redis 设置远程连接
默认情况下,Redis 是不允许默认连接的。
但我们的需求就是使用 Windows 上的客户端 redis.cli 连接到 Linux 上的 redis 服务。
解决办法依旧是更改 redis.conf 文件中的内容。即注释掉 bind 127.0.0.1(默认绑定本地的客户端访问)。

之后依旧是相同的操作,先终止 LInux 上 reids 服务,再开启 LInux 上 redis 的服务。这里不再贴图赘述。
然后就可以使用 Windows 上的 redis.cli 来连接到 LInux 上 reids 服务了。
这里不可以直接双击 redis.cli 来打开客户端,因为都是默认连接本地的 redis 服务的。
需要使用终端,且要配置响应参数的命令的输入才行:. \redis-cli.exe -h 你的虚拟机的IP地址 -p 6379 -a 你设置的密码。

 当然,防火墙没关的话,依旧是拒绝远程连接的。相关操作已经在 4.3 中说过了,这里不再赘述。
6.2.数据类型
- Redis 存储的是 key-value 结构的数据。
- 其中 key 是字符串类型。
 - value 有 5 种常用的数据类型
- 字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set
 
 
 

6.3.常用命令
- 更多命令可以参考 Redis 中文网:https://www.redis.net.cn
 
6.3.1.字符串 string 操作命令
Redis 中字符串类型的常用命令
- 设置指定 key 的值
 
set key value
- 获取指定 key 的值
 
get key
- 设置指定 key 的值,且将 key 的过期时间设置为 seconds 秒
 
setex key seconds value
- 只有在 key 不存在时才会设置 key 的值;如果 key 已经存在,该命令不执行任何操作。
 
setnx key value
- 删除 key
 
del key
key 相同情况下,后设置的 value 的值会覆盖掉之前的 value 的值。
6.3.2.哈希 hash 操作命令
Redis hash 是一个 string 类型的 field 和 value 的映射表。
hash 特别适合用于存储对象。

常用命令
- 将哈希表 key 中的字段 field 的值设为 value
 
hset key field value
- 获取存储在哈希表中指定字段的值
 
hget key field
- 删除存储在哈希表中的指定字段
 
hdel key field
- 获取哈希表中所有字段
 
hkeys key
- 获取哈希表中所有值
 
hvals key
- 获取在哈希表中指定 key 的所有字段和值
 
hgetall key
6.3.3.列表 list 操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序。

常用命令
- 将一个或多个值插入到列表头部
 
lpush key value1 [value2]
- 将一个或多个值加入到列表尾部
 
rpush key value
- 获取列表指定范围内的元素
 
lrange key start end
例如:lrange mylist 0 -1
- 移除并获取列表第一个元素,且将该元素返回
 
lpop key
- 移除并获取列表最后一个元素,且将该元素返回
 
rpop key
- 获取列表长度
 
llen key
- 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
 
brpop key1 [key2] timeout
6.3.4.集合 set 操作命令
Redis set 是 string 类型的无序集合。
集合成员是唯一的,这就意味着集合中不能出现重复的数据。

常用命令
- 向集合添加一个或多个成员
 
sadd key member1 [member2]
例如:sadd myset a b c d
- 返回集合中的所有成员
 
smembers key
例如:smembers myset
- 获取集合的成员数
 
scard key
- 返回给定所有集合的交集
 
sinter key1 [key2]
- 返回所有给定集合的并集
 
sunion key1 [key2]
- 返回给定所有集合的差集
 
sdiff key1 [key2]
- 移除集合中一个或多个成员
 
srem key member1 [member2]
6.3.5.有序集合 sorted set 操作命令
Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。
每个元素都会关联一个 double 类型的分数(score)。
redis 正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。

常用命令
- 向有序集合添加一个或多个成员,或者更新已存在成员的分数
 
zadd key score1 member1 [score2 member2]
例如:zadd myset3 10.0 a 9.0 b
- 通过索引区间返回有序集合中指定区间内的成员
 
zrange key start end [withscores]
例如:zrange myset3 0 -1
例如:zrange myset3 0 -1 withscores
- 有序集合中对指定成员的分数加上增量 increment
 
zincrby key increment member
例如:zincrby myset3 20 b,若 b 的值是 9,那么最终的输出结果就是 29。
- 移除有序集合中的一个或多个成员
 
zrem key member [member ...]
例如:zrem myset3 b
6.3.6.通用命令
- 查找所有符合给定模式(pattern)的 key,例如:
keys * 
keys pattern
检查给定 key 是否存在
exists key
- 返回 key 所储存的值的类型
 
type key
- 返回给定 key 的剩余生存时间 TTL(time to live),以秒为单位
 
ttl key
- 该命令用于在 key 存在时删除 key
 
del key
7.在 Java 中操作 Redis
7.1.介绍
Redis 的 Java 客户端很多,官方推荐的有三种:Jedis、Lettuce、Redisson。
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis。
在 Spring Boot 项目中还提供了对应的 Starter,即 spring-boot-starter-data-redis。
7.2.在 Idea 中使用 Jedis
- 首先要创建如下的项目结构
 

- pom.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>jedis_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        
        <!-- Jedis 相关的 maven 坐标 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.0</version>
        </dependency>
        
    </dependencies>
</project>
- JedisTest.java
 
com/itheima/test/JedisTest.java
package com.itheima.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
/**
 * 使用 Jedis 操作 Redis
 */
public class JedisTest {
    @Test
    public void testRedis(){
        //1.获取连接
        Jedis jedis = new Jedis("localhost",6379);
        
        //2.执行具体的操作
        jedis.set("username","xiaoming");
        String value = jedis.get("username");
        System.out.print("username:");
        System.out.println(value);
        //jedis.del("username");
        jedis.hset("myhash","addr","bj");
        String hValue = jedis.hget("myhash", "addr");
        System.out.print("key:myhash,field:addr,value:");
        System.out.println(hValue);
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
        //3.关闭连接
        jedis.close();
    }
}
- 控制台输出结果
 

7.3.Spring Data Redis
7.3.1.简单介绍
- 在 Spring Boot 项目中,可以使用 Spring Data Redis 来简化 Redis 操作。
 
- 相关 maven 坐标
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- Spring Data Redis 中提供了一个高度封装的类:RedisTemplate
- 其针对 jedis 客户端中大量 api 进行了归类封装,并将同一类型操作封装为 operation 接口
 - operation 接口的具体分类如下
- ValueOperations:简单 K-V 操作
 - setOperations:set 类型数据操作
 - ZSetOperations:zset 类型数据操作
 - HashOperations:针对 map 类型的数据操作
 - ListOperations:针对 list 类型的数据操作
 
 
 
7.3.2.项目准备工作
- 首先创建好这样的项目结构
 

- pom.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/>
    </parent>
    <groupId>com.itheima</groupId>
    <artifactId>springdataredis_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.5</version>
            </plugin>
        </plugins>
    </build>
</project>
- application.yml
 
resources 目录下的 application.yml
spring:
  application:
    name: springdataredis_demo
  # Redis 相关配置
  redis:
    host: localhost
    port: 6379
    # password: 123456
    database: 0 # 操作的是 0 号数据库(redis 默认是一共有 16 个数据库)
    jedis:
      # Redis 连接池配置
      pool:
        max-active: 8 # 最大连接数
        max-wait: 1ms # 连接池最大阻塞等待时间
        max-idle: 4 # 连接池中的最大空闲连接
        min-idle: 0 # 连接池中的最小空闲连接
- SpringBoot 项目的启动类 App.java
 
com/itheima/App.java
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
- 配置类:RedisConfig.java
 
使用 springboot 整合 redis 的专用客户端接口操作
此处使用的是 SpringBoot 框架提供的 RedisTemplate
RedisTemplate 在处理 key 和 value 时,会对其进行序列化操作
这就会导致一些问题。
比如:输入的 key 值是 city,但 redis 获得到的 key 值却是 \xac]xed\x00\x05t\x00\x04city。
此处提供了一个配置类,来专门处理 RedisTemplate 默认的序列化处理所导致的问题
com/itheima/config/RedisConfig.java
package com.itheima.config;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
 * Redis 配置类
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        //默认的 Key 序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}
其实使用 stringRedisTemplate 也可以解决这个问题,而且可以和客户端同步。
不过 stringRedisTemplate 只能存储 string 类型的数据。
- 测试类:SpringDataRedisTest.java
 
com/itheima/test/SpringDataRedisTest.java
package com.itheima.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    
}
7.3.3.string 类型数据操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 操作 String 类型数据
 */
@Test
public void testString() {
    redisTemplate.opsForValue().set("city123", "beijing");
    String value = (String) redisTemplate.opsForValue().get("city123");
    System.out.println(value);
	
	//设置值的同时,指定超时时间
    redisTemplate.opsForValue().set("key1", "value1", 10l, TimeUnit.SECONDS);
	//这里旨在 setNX 的功能
	//若设置的 key 值存在,该命令就不生效;反之,则生效
    Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");
    System.out.println(aBoolean);
}
最终控制台输出的结果

不过 10 秒后,key1 就不存在了。
有兴趣的话,可以自行去 redis 客户端输入 keys * 命令来查看信息。
7.3.4.hash 类型数据操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 操作 Hash 类型数据
 */
@Test
public void testHash() {
    HashOperations hashOperations = redisTemplate.opsForHash();
    //存值
    hashOperations.put("002", "name", "xiaoming");
    hashOperations.put("002", "age", "20");
    hashOperations.put("002", "address", "bj");
    //取值
    String age = (String) hashOperations.get("002", "age");
    System.out.println(age);
    //获得 hash 结构中的所有字段
    Set keys = hashOperations.keys("002");
    for (Object key : keys) {
        System.out.println(key);
    }
    //获得 hash 结构中的所有值
    List values = hashOperations.values("002");
    for (Object value : values) {
        System.out.println(value);
    }
}
idea 控制台输出的结果

7.3.5.list 类型数据操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 操作 List 类型的数据
 */
@Test
public void testList() {
    ListOperations listOperations = redisTemplate.opsForList();
    //存值
    listOperations.leftPush("mylist", "a");
    listOperations.leftPushAll("mylist", "b", "c", "d");
    //取值
    System.out.println("【mylist 的值】");
    List<String> mylist = listOperations.range("mylist", 0, -1);
    for (String value : mylist) {
        System.out.println(value);
    }
    //获得列表长度 llen
    Long size = listOperations.size("mylist");
    int lSize = size.intValue();
    System.out.println("【返回 mylist ,且删除掉元素】");
    for (int i = 0; i < lSize; i++) {
        //出队列
        String element = (String) listOperations.rightPop("mylist");
        System.out.println(element);
    }
}
idea 控制台输出的结果

7.3.6.set 类型的数据操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 操作 Set 类型的数据
 */
@Test
public void testSet() {
    SetOperations setOperations = redisTemplate.opsForSet();
    //存值
    setOperations.add("myset", "a", "b", "c", "a");
    //取值
    System.out.println("【第一次取值】");
    Set<String> myset = setOperations.members("myset");
    for (String o : myset) {
        System.out.println(o);
    }
    //删除成员
    setOperations.remove("myset", "a", "b");
    System.out.println("【第二次取值】");
    //取值
    myset = setOperations.members("myset");
    for (String o : myset) {
        System.out.println(o);
    }
}
idea 控制台输出的结果

7.3.7.zset 类型的数据操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 操作 ZSet 类型的数据
 */
@Test
public void testZset() {
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    //存值
    zSetOperations.add("myZset", "a", 10.0);
    zSetOperations.add("myZset", "b", 11.0);
    zSetOperations.add("myZset", "c", 12.0);
    zSetOperations.add("myZset", "a", 13.0);
    //取值
    System.out.println("[第一次取值]");
    Set<String> myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }
    //修改分数
    zSetOperations.incrementScore("myZset", "b", 20.0);
    //取值
    System.out.println("[第二次取值]");
    myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }
    //删除成员
    zSetOperations.remove("myZset", "a", "b");
    //取值
    System.out.println("[第三次取值]");
    myZset = zSetOperations.range("myZset", 0, -1);
    for (String s : myZset) {
        System.out.println(s);
    }
}
idea 控制台输出的结果

7.3.8.通用的数据类型操作
com/itheima/test/SpringDataRedisTest.java
/**
 * 通用操作,针对不同的数据类型都可以操作
 */
@Test
public void testCommon() {
    //获取 Redis 中所有的 key
    System.out.println("[keys *]");
    Set<String> keys = redisTemplate.keys("*");
    for (String key : keys) {
        System.out.println(key);
    }
    //判断某个 key 是否存在
    System.out.println("[exists key]");
    Boolean itcast = redisTemplate.hasKey("itcast");
    System.out.println(itcast);
    //删除指定 key
    redisTemplate.delete("myZset");
    //获取指定 key 对应的 value 的数据类型
    System.out.println("[type key]");
    DataType dataType = redisTemplate.type("myset");
    System.out.println(dataType.name());
}
idea 控制台输出的结果

