Git 分布式版本控制工具
课程内容
-
Git概述
-
Git代码托管服务
-
Git常用命令
-
在IDEA中使用Git
1. 前言
1.1 什么是Git
Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等),在软件开发过程中被广泛使用。
在IDEA开发工具中可以集成Git(后面会讲解Git安装和集成过程):
集成后在IDEA中可以看到Git相关图标:
可以通过启动两个IDEA窗口模拟两个开发人员来展示Git的使用:
其他的版本控制工具:
-
SVN
-
CVS
-
VSS
1.2 使用Git能做什么
-
代码回溯:Git在管理文件过程中会记录日志,方便回退到历史版本
-
版本切换:Git存在分支的概念,一个项目可以有多个分支(版本),可以任意切换
-
多人协作:Git支持多人协作,即一个团队共同开发一个项目,每个团队成员负责一部分代码,通过Git就可以管理和协调
-
远程备份:Git通过仓库管理文件,在Git中存在远程仓库,如果本地文件丢失还可以从远程仓库获取
2. Git概述
2.1 Git简介
Git 是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件,Git 仓库分为两种:
-
本地仓库:开发人员自己电脑上的 Git 仓库
-
远程仓库:远程服务器上的 Git 仓库
解释说明:
commit:提交,将本地文件和版本信息保存到本地仓库
push:推送,将本地仓库文件和版本信息上传到远程仓库
pull:拉取,将远程仓库文件和版本信息下载到本地仓库
2.2 Git下载与安装
下载地址: Git - Downloads
下载完成后得到安装文件:
直接双击完成安装即可,安装完成后可以在任意目录下点击鼠标右键,如果能够看到如下菜单则说明安装成功:
Git GUI Here:打开Git 图形界面
Git Bash Here:打开Git 命令行
Git安装目录结构如下:
3. Git代码托管服务
3.1 常用的Git代码托管服务
Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?
我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
名称 | 网址 | 说明 |
---|---|---|
gitHub | GitHub: Let’s build from here · GitHub | 一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub |
码云 | Gitee - 基于 Git 的代码托管和研发协作平台 | 国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快 |
GitLab | The DevSecOps Platform | GitLab | 一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 |
BitBucket | Bitbucket | Git solution for teams using Jira | 一家源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户 |
3.2 码云代码托管服务
码云网址:Gitee - 基于 Git 的代码托管和研发协作平台
使用码云的操作流程如下:
-
注册码云账号
-
登录码云
-
创建远程仓库
-
邀请其他用户成为仓库成员
3.2.1 注册码云账号
注册网址: 注册 - Gitee.com
3.2.2 登录码云
注册完成后可以使用刚刚注册的邮箱进行登录(地址: 登录 - Gitee.com )
3.2.3 创建远程仓库
登录成功后可以创建远程仓库,操作方式如下:
页面跳转到新建仓库页面:
解释说明:
仓库名称:必填,每个仓库都需要有一个名称,同一个码云账号下的仓库名称不能重复
路径:访问远程仓库时会使用到,一般无需手动指定,和仓库名称自动保持一致
开源:所有人都可以查看此仓库
私有:只有此仓库的成员可见,其他人不可见
创建完成后可以查看仓库信息:
注意:每个Git远程仓库都会对应一个网络地址,点击【克隆/下载】按钮,在弹出窗口点击【复制】按钮即可复制网络地址,地址如下:
https://gitee.com/ChuanZhiBoKe/myGitRepo.git
3.2.4 邀请其他用户成为仓库成员
前面已经在码云上创建了自己的远程仓库,目前仓库成员只有自己一个人(身份为管理员)。在企业实际开发中,一个项目往往是由多个人共同开发完成的,为了使多个参与者都有权限操作远程仓库,就需要邀请其他项目参与者成为当前仓库的成员。
点击管理按钮进入仓库管理页面,左侧菜单中可以看到【仓库成员管理】:
点击【开发者】菜单,跳转到如下页面:
点击【添加仓库成员】菜单下的【邀请用户】菜单,跳转到如下页面:
可以看到邀请用户有多种方式:链接邀请、直接添加、通过仓库邀请成员
注意:被邀请用户必须为码云的注册用户,否则无法成为仓库成员
4. Git常用命令
4.1 Git全局设置
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。在Git 命令行中执行下面命令:
设置用户信息
git config --global user.name "itcast"
git config --global user.email "hello@itcast.cn"
查看配置信息
git config --list
注意:上面设置的user.name和user.email并不是我们在注册码云账号时使用的用户名和邮箱,此处可以任意设置。
4.2 获取Git仓库
要使用Git对我们的代码进行管理,首先需要获得Git仓库。
获取Git仓库通常有两种方式:
-
在本地初始化Git仓库(不常用)
-
从远程仓库克隆(常用)
4.2.1 在本地初始化Git仓库
操作步骤如下:
-
在任意目录下创建一个空目录(例如repo1)作为我们的本地Git仓库
-
进入这个目录中,点击右键打开Git bash窗口
-
执行命令git init
如果在当前目录中看到.git文件夹(此文件夹为隐藏文件夹)则说明Git仓库创建成功
4.2.2 从远程仓库克隆
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地
命令格式:git clone 远程仓库地址
4.3 工作区、暂存区、版本库
为了更好的学习Git,我们需要了解Git相关的一些概念,这些概念在后面的学习中会经常提到。
版本库:前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
工作区:包含.git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码
暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
4.4 Git工作区中文件的状态
Git工作区中的文件存在两种状态:
-
untracked 未跟踪(未被纳入版本控制)
-
tracked 已跟踪(被纳入版本控制)
1)Unmodified 未修改状态
2)Modified 已修改状态
3)Staged 已暂存状态
注意:文件的状态会随着我们执行Git的命令发生变化
4.5 本地仓库操作
本地仓库常用命令如下:
-
git status 查看文件状态
-
git add 将文件的修改加入暂存区
-
git reset 将暂存区的文件取消暂存或者是切换到指定版本
-
git commit 将暂存区的文件修改提交到版本库
-
git log 查看日志
4.5.1 git status
git status 命令用于查看文件状态
注意:由于工作区中文件状态的不同,执行 git status 命令后的输出也会不同
4.5.2 git add
git add 命令的作用是将文件的修改加入暂存区,命令格式:git add fileName
加入暂存区后再执行 git status 命令,可以发现文件的状态已经发生变化。
4.5.3 git reset
git reset 命令的作用是将暂存区的文件取消暂存或者是切换到指定版本
取消暂存命令格式:git reset 文件名
切换到指定版本命令格式:git reset --hard 版本号
注意:每次Git提交都会产生新的版本号,通过版本号就可以回到历史版本
4.5.4 git commit
git commit 命令的作用是将暂存区的文件修改提交到版本库,命令格式:git commit -m msg 文件名
解释说明:
-m:代表message,每次提交时需要设置,会记录到日志中
可以使用通配符*一次提交多个文件
4.5.5 git log
git log 命令的作用是查看提交日志
通过git log命令查看日志,可以发现每次提交都会产生一个版本号,提交时设置的message、提交人、邮箱、提交时间等信息都会记录到日志中
4.6 远程仓库操作
前面执行的命令操作都是针对的本地仓库,本节我们会学习关于远程仓库的一些操作,具体包括:
-
git remote 查看远程仓库
-
git remote add 添加远程仓库
-
git clone 从远程仓库克隆
-
git pull 从远程仓库拉取
-
git push 推送到远程仓库
4.6.1 git remote
如果要查看已经配置的远程仓库服务器,可以执行 git remote 命令,它会列出每一个远程服务器的简称。
如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字。
解释说明:
可以通过-v参数查看远程仓库更加详细的信息
本地仓库配置的远程仓库都需要一个简称,后续在和远程仓库交互时会使用到这个简称
4.6.2 git remote add
添加远程仓库命令格式:git remote add 简称 远程仓库地址
注意:一个本地仓库可以关联多个远程仓库
4.6.3 git clone
如果你想获得一份已经存在了的 Git 远程仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等)。
克隆仓库的命令格式: git clone 远程仓库地址
4.6.4 git push
将本地仓库内容推送到远程仓库,命令格式:git push 远程仓库简称 分支名称
在使用git push命令将本地文件推送至码云远程仓库时,如果是第一次操作,需要进行身份认证,认证通过才可以推送,如下:
注意:上面的用户名和密码对应的就是我们在码云上注册的用户名和密码,认证通过后会将用户名和密码保存到windows系统中(如下图),后续再推送则无需重复输入用户名和密码。
推送完成后可以到远程仓库中查看文件的变化。
解释说明:
一个仓库可以有多个分支,默认情况下在创建仓库后会自动创建一个master分支
后面会讲解分支相关的操作
4.6.5 git pull
git pull 命令的作用是从远程仓库获取最新版本并合并到本地仓库
命令格式:git pull 远程仓库简称 分支名称
注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories )
解决此问题可以在git pull命令后加入参数--allow-unrelated-histories
4.7 分支操作
分支是Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
本地仓库和远程仓库中都有分支,同一个仓库可以有多个分支,各个分支相互独立,互不干扰。
通过git init 命令创建本地仓库时默认会创建一个master分支。
本节我们会学习关于分支的相关命令,具体命令如下:
-
git branch 查看分支
-
git branch [name] 创建分支
-
git checkout [name] 切换分支
-
git push [shortName] [name] 推送至远程仓库分支
-
git merge [name] 合并分支
4.7.1 查看分支
查看分支命令:git branch
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
4.7.2 创建分支
创建分支命令格式:git branch 分支名称
4.7.3 切换分支
一个仓库中可以有多个分支,切换分支命令格式:git checkout 分支名称
注意:在命令行中会显示出当前所在分支,如上图所示。
4.7.4 推送至远程仓库分支
推送至远程仓库分支命令格式:git push 远程仓库简称 分支命令
推送完成后可以查看远程仓库:
4.7.5 合并分支
合并分支就是将两个分支的文件进行合并处理,命令格式:git merge 分支命令
注意:分支合并时需注意合并的方向,如上图所示,在Master分支执行操作,结果就是将b3分支合并到Master分支。
4.8 标签操作
Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2等)。下面是mybatis-plus的标签:
在本节中,我们将学习如下和标签相关的命令:
-
git tag 查看标签
-
git tag [name] 创建标签
-
git push [shortName] [name] 将标签推送至远程仓库
-
git checkout -b [branch] [name] 检出标签
4.8.1 查看标签
查看标签命令:git tag
4.8.2 创建标签
创建标签命令:git tag 标签名
4.8.3 将标签推送至远程仓库
将标签推送至远程仓库命令:git push 远程仓库简称 标签名
推送完成后可以在远程仓库中查看标签。
4.8.4 检出标签
检出标签时需要新建一个分支来指向某个标签,检出标签的命令格式:git checkout -b 分支名 标签名
5. 在IDEA中使用Git
通过Git命令可以完成Git相关操作,为了简化操作过程,我们可以在IEDA中配置Git,配置好后就可以在IDEA中通过图形化的方式来操作Git。
5.1 在IDEA中配置Git
在IDEA中使用Git,本质上还是使用的本地安装的Git软件,所以需要提前安装好Git并在IDEA中配置Git。
Git安装目录:
解释说明:
git.exe:Git安装目录下的可执行文件,前面执行的git命令,其实就是执行的这个文件
IDEA中的配置:
说明:如果Git安装在默认目录中(C:\Program Files\Git),则IDEA中无需再手动配置,直接就可以使用。
5.2 获取Git仓库
在IDEA中获取Git仓库有两种方式:
-
本地初始化仓库,本质就是执行 git init 命令
-
从远程仓库克隆,本质就是执行 git clone 命令
5.2.1 本地初始化仓库
在IDEA中通过如下操作可以在本地初始化一个本地仓库,其实底层就是执行的 git init 命令。操作过程如下:
1)依次选择菜单【VCS】---【Import into Version Control】---【Create Git Repository】
2)在弹出的【Create Git Repository】对话框中选择当前项目根目录,点击【OK】按钮:
操作完成后可以看到当前项目根目录下出现了.git隐藏目录:
操作完成后可以在IDEA的工具栏中看到Git的相关操作图标:
5.2.2 从远程仓库克隆
在IDEA中从远程仓库克隆本质就是执行的 git clone 命令,具体操作过程如下:
1)在IDEA开始窗口中点击【Get from Version Control】
2)在弹出的【Get from Version Control】窗口中输入远程仓库的URL地址和对应的本地仓库存放目录,点击【Clone】按钮进行仓库克隆操作
5.3 Git忽略文件
在Git工作区中有一个特殊的文件 .gitignore,通过此文件可以指定工作区中的哪些文件不需要Git管理。我们在码云上创建Git远程仓库时可以指定生成此文件,如下:
创建完成后效果如下:
解释说明:
1)我们在使用Git管理项目代码时,并不是所有文件都需要Git管理,例如Java项目中编译的.class文件、开发工具自带的配置文件等,这些文件没有必要交给Git管理,所以也就不需要提交到Git版本库中
2)注意忽略文件的名称是固定的,不能修改
3)添加到忽略列表中的文件后续Git工具就会忽略它
一个参考的.gitignore文件内容如下:
<span style="background-color:#dadada"><span style="color:#1f0909">.git
logs
rebel.xml
target/
!.mvn/wrapper/maven-wrapper.jar
log.path_IS_UNDEFINED
.DS_Store
offline_user.md
*.class
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr</span></span>
5.4 本地仓库操作
本地仓库操作:
-
将文件加入暂存区,本质就是执行 git add 命令
-
将暂存区的文件提交到版本库,本质就是执行 git commit 命令
-
查看日志,本质就是执行 git log 命令
5.4.1 将文件加入暂存区
当在Git工作区新增文件或者对已有文件修改后,就需要将文件的修改加入暂存区,具体操作如下:
5.4.2 将暂存区文件提交到版本库
将暂存区文件提交到版本库,可以选择一个文件进行提交,也可以选择整个项目提交多个文件。在IEDA中对文件的提交进行了简化操作,也就是如果文件修改后,无需再加入暂存区,可以直接提交。
1)提交一个文件:
可以看到,如果选中一个文件提交,则菜单名称为【Commit File...】
2)提交多个文件:
可以看到,如果提交多个文件,则菜单名称为【Commit Directory...】
由于提交操作属于高频操作,所以为了进一步方便操作,在IDEA的工具栏中提供了提交操作的快捷按钮:
5.4.3 查看日志
查看日志,既可以查看整个仓库的提交日志,也可以查看某个文件的提交日志。
1)查看整个项目的提交日志:
2)查看某个文件的提交日志
5.5 远程仓库操作
远程仓库操作:
-
查看远程仓库,本质就是执行 git remote 命令
-
添加远程仓库,本质就是执行 git remote add 命令
-
推送至远程仓库,本质就是执行 git push 命令
-
从远程仓库拉取,本质就是执行 git pull 命令
5.5.1 查看远程仓库
操作过程如下:
在弹出的【Git Remotes】窗口中可以看到配置的远程仓库:
5.5.2 添加远程仓库
一个本地仓库可以配置多个远程仓库,在【Git Remotes】窗口中点击【+】来添加一个新的远程仓库:
5.5.3 推送至远程仓库
可以通过如下操作将本地仓库文件推送至远程仓库:
在弹出的【Push Commits】窗口中可以看到本次推送的文件,点击【Push】按钮即可推送至远程仓库:
由于推送至远程仓库操作属于高频操作,所以可以通过IDEA工具栏中的提交快捷按钮同时完成提交和推送:
点击【Commit and Push...】按钮同时完成提交和推送操作
5.5.4 从远程仓库拉取
可以通过如下操作从远程仓库拉取:
由于从远程仓库拉取文件属于高频操作,所以在IDEA的工具栏中提供了对应的快捷按钮:
在弹出的【Update Project】窗口中点击【OK】:
5.6 分支操作
分支操作:
-
查看分支,本质就是执行 git branch 命令
-
创建分支,本质就是执行 git branch 分支名 命令
-
切换分支,本质就是执行 git checkout 命令
-
将分支推送到远程仓库,本质就是执行 git push 命令
-
合并分支,本质就是执行 git merge 命令
5.6.1 查看分支
可以通过如下操作查看分支:
在弹出的窗口中可以看到本地分支和远程分支:
由于分支操作属于高频操作,所以在IDEA的状态栏中提供了分支操作的快捷按钮:
点击【master】快捷按钮即可弹出【Git Branches】分支窗口:
5.6.2 创建分支
在【Git Branches】分支窗口中点击【New Branch】,弹出如下窗口:
在弹出的【Create New Branch】窗口中输入新分支的名称,点击【Create】按钮完成分支创建
5.6.3 切换分支
通过如下操作可以切换分支:
5.6.4 将分支推送到远程仓库
通过如下操作可以将分支推送到远程仓库:
5.6.5 合并分支
通过下面操作可以进行分支的合并:
git
$ ssh -T git@gitee.com 配置秘钥 $ git remote add origin https://gitee.com/lingyuma/hello-git.git 添加远程仓库的ssh地址 $ git push -u origin master 推送远程仓库 $ git add test2.txt 添加文件 $ git commit -m 'commit test2.txt' 将文件推送至本地仓库 $ git push -u origin master 上传至网络仓库 $ git pull origin master 拉取远程仓库文件至本地
设置用户信息 git config --global user.name "itcast" git config --global user.email "hello@itcast.cn"
查看配置信息系 git config --list
从远程仓库获取数据 git clone 远程链接地址
将文件保存到暂存区 git add * 将暂存区的文件修改提交到版本库 git commit -m "init hello.txt" 文件名 git reset --hard 版本号 将暂存区的文件取消暂存或者是切换到指定版本 git log 查看日志 查看当前文件状态 git status (untracked 表示未跟踪(未被纳入版本控制) tracked 已跟踪 (被纳入版本控制) Unmodified 未修改状态 Modified 已修改状态 Staged 已暂存状态) git trmote 查看远程仓库 git remote add添加远程仓库 git clone远程仓库克隆 git pull 从仓库拉取 git push推送到远程仓库
设置秘钥 ssh-keygen -t rsa -C "machenghao" //-C是备注标识
查找ssh秘钥 cat ~/.ssh/id_rsa.pub
从远程仓库拉取不相关的远程仓库数据
git pull origin master --allow-unrelated-histories
分支操作
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
git branch [name] 创建分支
git checkout [name] 切换分支
git push [shortName] [name] 推送至远程仓库分支
git merge [name] 合并分支
git commit -m “手动处理文件合并问题” b1.txt
上面 运行报fatal:cannot do a partial commit during a merge
执行git commit -m “手动处理文件合并问题” b1.txt -i解决
标签
git tag 列出已有的标签
git tag[name] 创建标签
git push [shortName] [name] 将标签推送至远程仓库
git checkout -b [branch] [name] 检出标签
Linux
课程内容
-
Linux简介
-
Linux安装
-
Linux常用命令
1. 前言
1.1 什么是Linux
Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统。
1.2 为什么要学Linux
那么我们为什么要学习Linux呢,主要出于两个方面的原因。
1). 企业用人要求
以下,是从知名招聘网站上搜索的java开发工程师的岗位要求,在很多的岗位要求中都提到了Linux操作系统的经验。
为什么作为javaEE开发工程师,企业还要求我们会Linux操作系统的相关知识呢?
这是因为Linux操作系统提供了很多稳定的发行版本,广泛的应用在我们的各种服务器操作系统领域,我们将来开发出来的项目,最终要上线运行,就需要将项目部署在Linux服务器中。
2). 个人发展需要
我们作为javaEE开发工程师,将来在企业中开发时会涉及到很多的数据库、中间件等技术,比如MySQL、Redis、MQ等技术,而这些应用软件大多都是需要安装在Linux系统中使用的。我们做为开发人员,是需要通过远程工具连接Linux操作系统,然后来操作这些软件的。而且一些小公司,可能还需要我们自己在服务器上安装这些软件。
所以,不管从企业的用人需求层面,还是个人发展需要层面来讲,我们作为服务端开发工程师,Linux的基本使用是我们必不可少的技能。
1.3 学完Linux能干什么
学习完Linux操作系统课程之后,我们可以做以下几个方面的事情:
1). 环境搭建
系统安装 : 一般我们不会直接将Linux系统安装在本机电脑上,而会安装在公司的一台专门的服务器上。
远程连接 : 那么我们要想使用服务器,一般都是通过远程连接工具连接Linux系统进行操作。
2). 常用命令
连接上服务器之后,我们可以通过所学习的相关指令, 来操作Linux服务器,在Linux服务器中可以执行如下操作:
A. 文件、目录的基本操作(查看,删除,创建等)
B. 文件及文件夹的拷贝、移动、重命名
C. 文件的打包、压缩、解压缩操作
D. 文本的编辑
3). 安装软件
基本的常用指令学会操作之后,我们可以在Linux服务器中安装我们开发常用的软件,比如: JDK、Tomcat、MySQL的安装及配置。
4). 项目部署
把基础的软件及环境安装配置好之后,我们就可以将我们开发的项目部署在服务器中进行运行并测试。
对于我们学习Linux操作系统时,Linux命令是基础,也是学习Linux系统的重点内容,虽然Linux的指令有很多,但是我们常用的指令并不多,大家在学习的时候,主要掌握这部分常用的指令就可以了,对于其他的指令,以后我们用到的时候,知道怎么查询即可。
对于Linux的常用指令的学习,最好的学习方法就是:多敲
2. Linux简介
2.1 主流操作系统
不同领域的主流操作系统,主要分为以下这么几类: 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来,这几个领域中,代表性的操作系统是那些?
1). 桌面操作系统
操作系统 | 特点 |
---|---|
Windows | 用户数量最多 |
MacOS | 操作体验好,办公人士首选 |
Linux | 用户数量少(桌面操作系统,Linux使用较少) |
2). 服务器操作系统
操作系统 | 特点 |
---|---|
Unix | 安全、稳定、付费 |
Linux | 安全、稳定、免费、占有率高 |
Windows Server | 付费、占有率低 |
3). 移动设备操作系统
操作系统 | 特点 |
---|---|
Android | 基于 Linux 、开源,主要用于智能手机、平板电脑和智能电视 |
IOS | 苹果公司开发、不开源,用于苹果公司的产品,例如:iPhone、 iPad |
4). 嵌入式操作系统
操作系统 | 特点 |
---|---|
Linux | 机顶盒、路由器、交换机 |
2.2 Linux发展历史
时间:1991年
地点:芬兰赫尔辛基大学
人物:Linus Torvalds(21岁)
语言:C语言、汇编语言
logo:企鹅
特点:免费、开源(源代码开放)、多用户(同时允许多个用户操作同一个Linux系统)、多任务(同时允许多个任务执行)
2.3 Linux系统版本
Linux系统的版本分为两种,分别是: 内核版 和 发行版。
1). 内核版
-
由Linus Torvalds及其团队开发、维护
-
免费、开源
-
负责控制硬件
2). 发行版
-
基于Linux内核版进行扩展
-
由各个Linux厂商开发、维护
-
有收费版本和免费版本
我们使用Linux操作系统,实际上选择的是Linux的发行版本。在linux系统中,有各种各样的发行版本,具体如下:
发行版本 | LOGO | 特点 |
---|---|---|
Ubuntu | 以桌面应用为主 | |
RedHat | 应用最广泛、收费 | |
CentOS | RedHat的社区版、免费 | |
openSUSE | 对个人完全免费、图形界面华丽 | |
Fedora | 功能完备、快速更新、免费 | |
红旗Linux | 北京中科红旗软件技术有限公司开发 |
除了上述罗列出来的发行版,还有很多Linux发行版,这里,我们就不再一一列举了。
3. Linux安装
3.1 安装方式介绍
Linux系统的安装方式,主要包含以下两种:
方式 | 概述 | 场景 |
---|---|---|
物理机安装 | 直接将操作系统安装到服务器硬件上 | 企业开发中,我们使用的服务器基本都是采用这种方式 |
虚拟机安装 | 通过虚拟机软件安装 | 我们在学习阶段,没有自己服务器,而我们又需要学Linux,就可以安装在虚拟机上 |
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能、运行在完全隔离环境中的完整计算机系统。常用虚拟机软件:
-
VMWare
-
VirtualBox
-
VMLite WorkStation
-
Qemu
-
HopeddotVOS
那么我们就可以在课程中将Linux操作系统安装在虚拟机中,我们课上选择的虚拟机软件是VMware。
3.2 安装VMware
在我们的课程资料中提供了VMware的安装程序。直接双击运行VMware安装程序,根据提示完成安装即可。
以上就是VMware在安装时的每一步操作,基本上就是点击 "下一步" 一直进行安装。
3.3 安装Linux
VMware虚拟机安装完毕之后,我们就可以打开VMware,并在上面来安装Linux操作系统。具体步骤如下:
1). 选择创建新的虚拟机
2). 选择"典型"配置
3). 选择"稍后安装操作系统(S)"
4). 选择"Linux"操作系统,"CentOS7 64位"版本
5). 设置虚拟机的名称及系统文件存放路径
6). 设置磁盘容量
7). 自定义硬件信息
8). 启动上述创建的新虚拟机
9). 选择"Install CentOS7"
进入到Linux系统里面, 我们发现光标无法移动到windows操作系统中了, 这个时候, 我们可以通过快捷键 "Ctrl+Alt" 切换光标到windows系统中。
10). 选择语言为 "简体中文"
11). 选择"自动配置分区"
12). 选择"最小安装"
13). 设置"root"用户密码
安装完毕后,点击窗口中的蓝色的 "重启" 按钮,重启Linux系统。
14). 登录系统
注意 : 在Linux系统中,在命令行中输入密码信息,为了保证安全性,密码是不显示的(看似没有输入,实际已经输入了);
3.4 网卡设置
服务器重启完成之后,我们可以通过linux的指令 ip addr
来查询Linux系统的IP地址,具体信息如下:
从图中我们可以看到,并没有获取到linux系统的IP地址,这是为什么呢?这是由于启动服务器时未加载网卡,导致IP地址初始化失败而造成的。那么接下来我们就需要来修改网络初始化配置,设定网卡在系统启动时初始化。
具体操作步骤如下:
1). 修改网卡的配置项
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#000000">cd</span> <span style="color:#981a1a">/</span> <span style="color:#000000">进入根目录</span>
<span style="color:#000000">cd</span> <span style="color:#000000">etc</span> <span style="color:#000000">进入etc目录</span>
<span style="color:#000000">cd</span> <span style="color:#000000">sysconfig</span> <span style="color:#000000">进入sysconfig目录</span>
<span style="color:#000000">cd</span> <span style="color:#000000">network</span><span style="color:#981a1a">-</span><span style="color:#000000">scripts</span> <span style="color:#000000">进入network</span><span style="color:#981a1a">-</span><span style="color:#000000">scripts</span>
<span style="color:#000000">vi</span> <span style="color:#000000">ifcfg</span><span style="color:#981a1a">-</span><span style="color:#000000">ens33</span> <span style="color:#000000">编辑ifcfg</span><span style="color:#981a1a">-</span><span style="color:#000000">ens33文件</span>
<span style="color:#000000">进入文件后执行如下操作</span>:
<span style="color:#000000">①</span>. <span style="color:#000000">按</span> <span style="color:#000000">i</span> <span style="color:#000000">键</span> <span style="color:#000000">进入编辑状态</span>
<span style="color:#000000">②</span>. <span style="color:#000000">按↑↓键来移动光标</span>, <span style="color:#000000">删除no</span>,<span style="color:#000000">输入yes</span>
<span style="color:#000000">③</span>. <span style="color:#000000">按</span> <span style="color:#000000">ESC</span> <span style="color:#000000">键</span>
<span style="color:#000000">④</span>. <span style="color:#000000">输入</span> :<span style="color:#000000">wq</span>
<span style="color:#000000">⑤</span>. <span style="color:#000000">按</span> <span style="color:#000000">ENTER</span> <span style="color:#000000">保存退出</span></span></span>
备注: 在上述的操作中用到了Linux中的相关指令, 目前大家不用深究, 后面会详细讲解, 目前大家只需要把这个文件的配置项ONBOOT的值有no改为yes即可。
2). 重新启动虚拟机
重启之后, 再次输入root的用户名密码,登录到Linux系统之后,可以通过指令 ip addr
来查看IP地址。
3.5 安装SSH连接工具
3.5.1 SSH连接工具介绍
Linux已经安装并且配置好了,接下来我们要来学习Linux的基本操作指令。而在学习之前,我们还需要做一件事情,由于我们企业开发时,Linux服务器一般都是在远程的机房部署的,我们要操作服务器,不会每次都跑到远程的机房里面操作,而是会直接通过SSH连接工具进行连接操作。
SSH(Secure Shell),建立在应用层基础上的安全协议。常用的SSH连接工具:
SSH工具 | LOGO | 说明 |
---|---|---|
putty | 免费, 界面简单, 功能单一 | |
secureCRT | 收费, 功能强大 | |
xshell | 收费版/免费版 | |
finalshell | 免费, 功能强大, 界面效果好 (课程中采用) |
3.5.2 FinalShell安装
在课程资料中,提供了finalShell的安装包
双击.exe文件,然后进行正常的安装即可。
3.5.3 连接Linux
1). 打开finalShell
2). 建立连接
3.6 Linux目录结构
登录到Linux系统之后,我们需要先来熟悉一下Linux的目录结构。在Linux系统中,也是存在目录的概念的,但是Linux的目录结构和Windows的目录结构是存在比较多的差异的 在Windows目录下,是一个一个的盘符(C盘、D盘、E盘),目录是归属于某一个盘符的。Linux系统中的目录有以下特点:
A. / 是所有目录的顶点
B. 目录结构像一颗倒挂的树
Linux 和 Windows的目录结构对比:
Linux的目录结构,如下:
根目录/ 下各个目录的作用及含义说明:
编号 | 目录 | 含义 |
---|---|---|
1 | /bin | 存放二进制可执行文件 |
2 | /boot | 存放系统引导时使用的各种文件 |
3 | /dev | 存放设备文件 |
4 | /etc | 存放系统配置文件 |
5 | /home | 存放系统用户的文件 |
6 | /lib | 存放程序运行所需的共享库和内核模块 |
7 | /opt | 额外安装的可选应用程序包所放置的位置 |
8 | /root | 超级用户目录 |
9 | /sbin | 存放二进制可执行文件,只有root用户才能访问 |
10 | /tmp | 存放临时文件 |
11 | /usr | 存放系统应用程序 |
12 | /var | 存放运行时需要改变数据的文件,例如日志文件 |
4. Linux常用命令
4.1 Linux命令初体验
4.1.1 常用命令演示
在这一部分中,我们主要介绍几个常用的命令,让大家快速感受以下Linux指令的操作方式。主要包含以下几个指令:
序号 | 命令 | 对应英文 | 作用 |
---|---|---|---|
1 | ls [目录名] | list | 查看当前目录下的内容 |
2 | pwd | print work directory | 查看当前所在目录 |
3 | cd [目录名] | change directory | 切换目录 |
4 | touch [文件名] | touch | 如果文件不存在,创建文件 |
5 | mkdir [目录名] | make directory | 创建目录 |
6 | rm [文件名] | remove | 删除指定文件 |
接下来,我们快速的来演示一下这些常用的指令。
1). ls
指令解读:
ls 查看当前目录下的内容(文件及目录)
ls / 查看指定目录(/)下的内容
2). pwd
指令解读:
pwd 查看当前所在目录
3). cd
指令解读:
cd / 切换到根目录
cd /root 切换到/root目录
4). touch
指令解读:
touch 1.txt 创建文件1.txt
touch 2.txt 3.txt 4.txt 一次性创建文件2.txt,3.txt,3.txt
5). mkdir
指令解读:
mkdir 01 创建文件夹01
6). rm
指令解读:
rm 4.txt 删除文件 (删除文件时,需要确认,输入y, 代表确定)
==注意:==
==在执行Linux命令时,提示信息如果显示为乱码,如上图所示。这是由于编码问题导致,只需要修改Linux的编码即可,命令如下:==
echo 'LANG="en_US.UTF-8"' >> /etc/profile
source /etc/profile
4.1.2 Linux命令使用技巧
在我们使用Linux系统命令时,可以使用以下几个技巧:
1). Tab键自动补全
2). 连续两次Tab键,给出操作提示
3). 使用上下箭头快速调出曾经使用过的命令
4). 使用clear命令或者Ctrl+l快捷键实现清屏
操作示例:
A. 执行指令的时候,对于操作的文件/目录,按一下Tab会自动补全:
B. 如果上述以 "1." 开头的文件有多个,可以按两下Tab键,给出操作提示:
C. 使用clear命令或者Ctrl+l快捷键实现清屏:
清屏之后,界面就变得干净了:
4.1.3 Linux命令格式
<span style="background-color:#dadada"><span style="color:#1f0909">command [-options] [parameter]
说明:
command: 命令名
[-options]: 选项,可用来对命令进行控制,也可以省略
[parameter]: 传给命令的参数,可以是零个、一个或者多个
注意:
[] 代表可选
命令名、选项、参数之间有空格进行分隔</span></span>
操作示例:
4.2 文件目录操作命令
4.2.1 ls
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 显示指定目录下的内容
语法: ls [-al] [dir]
说明:
-a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
-l 除文件名称外,同时将文件型态(d表示目录,-表示文件)、权限、拥有者、文件大小等信息详细列出
注意:
由于我们使用ls命令时经常需要加入-l选项,所以Linux为ls -l命令提供了一种简写方式,即ll
常见用法:
ls -al 查看当前目录的所有文件及目录详细信息
ls -al /etc 查看/etc目录下所有文件及目录详细信息
ll 查看当前目录文件及目录的详细信息 </span></span>
操作示例:
4.2.2 cd
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 用于切换当前工作目录,即进入指定目录
语法: cd [dirName]
特殊说明:
~ 表示用户的home目录
. 表示目前所在的目录
.. 表示目前目录位置的上级目录
举例:
cd .. 切换到当前目录的上级目录
cd ~ 切换到用户的home目录
cd /usr/local 切换到/usr/local目录</span></span>
备注:
用户的home目录
root用户 /root
其他用户 /home/xxx
操作示例:
cd .. 切换到当前目录位置的上级目录; 可以通过 cd ../.. 来切换到上级目录的上级目录。
4.2.3 cat
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 用于显示文件内容
语法: cat [-n] fileName
说明:
-n: 由1开始对所有输出的行数编号
举例:
cat /etc/profile 查看/etc目录下的profile文件内容</span></span>
操作演示:
cat 指令会一次性查看文件的所有内容,如果文件内容比较多,这个时候查看起来就不是很方便了,这个时候我们可以通过一个新的指令more。
4.2.4 more
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 以分页的形式显示文件内容
语法: more fileName
操作说明:
回车键 向下滚动一行
空格键 向下滚动一屏
b 返回上一屏
q或者Ctrl+C 退出more
举例:
more /etc/profile 以分页方式显示/etc目录下的profile文件内容</span></span>
操作示例:
当我们在查看一些比较大的文件时,我们可能需要经常查询文件尾部的数据信息,那这个时候如果文件很大,我们要一直向下翻页,直到最后一页,去看最新添加的数据,这种方式就比较繁琐了,此时,我们可以借助于tail指令。
4.2.5 tail
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 查看文件末尾的内容
语法: 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文件末尾内容并显示</span></span>
操作示例:
A. 默认查询文件尾部10行记录
B. 可以通过指定参数设置查询尾部指定行数的数据
C. 动态读取文件尾部的数据
在窗口1中执行指令 tail -f 1.txt
动态查看文件尾部的数据。然后在顶部的标签中右键选择 "复制标签",打开新的窗口2 , 此时再新打开的窗口2中执行指令 echo 1 >> 1.txt
, 往1.txt文件尾部追加内容,然后我们就可以在窗口1中看到最新的文件尾部的数据。
如果我们不想查看文件尾部的数据了,可以直接使用快捷键 Ctrl+C , 结束当前进程。
4.2.6 mkdir
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 创建目录
语法: mkdir [-p] dirName
说明:
-p: 确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建
举例:
mkdir itcast 在当前目录下,建立一个名为itcast的子目录
mkdir -p itcast/test 在工作目录下的itcast目录中建立一个名为test的子目录,若itcast目录不存在,则建立一个</span></span>
操作演示:
4.2.7 rmdir
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 删除空目录
语法: rmdir [-p] dirName
说明:
-p: 当子目录被删除后使父目录为空目录的话,则一并删除
举例:
rmdir itcast 删除名为itcast的空目录
rmdir -p itcast/test 删除itcast目录中名为test的子目录,若test目录删除后itcast目录变为空目录,则也被删除
rmdir itcast* 删除名称以itcast开始的空目录</span></span>
操作演示:
A. 删除空目录
B. 删除非空目录
C. 使用*通配符删除目录
*: 是一个通配符,代表任意字符;
rmdir itcast* : 删除以itcast开头的目录
rmdir *itcast : 删除以itcast结尾的目录
4.2.8 rm
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 删除文件或者目录
语法: rm [-rf] name
说明:
-r: 将目录及目录中所有文件(目录)逐一删除,即递归删除
-f: 无需确认,直接删除
举例:
rm -r itcast/ 删除名为itcast的目录和目录中所有文件,删除前需确认
rm -rf itcast/ 无需确认,直接删除名为itcast的目录和目录中所有文件
rm -f hello.txt 无需确认,直接删除hello.txt文件
</span></span>
操作示例:
==注意: 对于 rm -rf xxx 这样的指令,在执行的时候,一定要慎重,确认无误后再进行删除,避免误删。==
4.3 拷贝移动命令
4.3.1 cp
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 用于复制文件或目录
语法: cp [-r] source dest
说明:
-r: 如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
举例:
cp hello.txt itcast/ 将hello.txt复制到itcast目录中
cp hello.txt ./hi.txt 将hello.txt复制到当前目录,并改名为hi.txt
cp -r itcast/ ./itheima/ 将itcast目录和目录下所有文件复制到itheima目录下
cp -r itcast/* ./itheima/ 将itcast目录下所有文件复制到itheima目录下</span></span>
操作示例:
如果拷贝的内容是目录,需要加上参数 -r
4.3.2 mv
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 为文件或目录改名、或将文件或目录移动到其它位置
语法: mv source dest
举例:
mv hello.txt hi.txt 将hello.txt改名为hi.txt
mv hi.txt itheima/ 将文件hi.txt移动到itheima目录中
mv hi.txt itheima/hello.txt 将hi.txt移动到itheima目录中,并改名为hello.txt
mv itcast/ itheima/ 如果itheima目录不存在,将itcast目录改名为itheima
mv itcast/ itheima/ 如果itheima目录存在,将itcast目录移动到itheima目录中</span></span>
操作示例:
mv 命令既能够改名,又可以移动,具体是改名还是移动,系统会根据我们输入的参数进行判定(如果第二个参数dest是一个已存在的目录,将执行移动操作,其他情况都是改名)
4.4 打包压缩命令
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 对文件进行打包、解包、压缩、解压
语法: 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.tar
tar -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目录
</span></span>
操作示例:
A. 打包
B. 打包并压缩
C. 解包
D. 解压
解压到指定目录,需要加上参数 -C
4.5 文本编辑命令
文本编辑的命令,主要包含两个: vi 和 vim,两个命令的用法类似,我们课程中主要讲解vim的使用。
4.5.1 vi&vim介绍
作用: vi命令是Linux系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于Windows中的记事本
语法: vi fileName
说明: 1). vim是从vi发展来的一个功能更加强大的文本编辑工具,编辑文件时可以对文本内容进行着色,方便我们对文件进行编辑处理,所以实际工作中vim更加常用。 2). 要使用vim命令,需要我们自己完成安装。可以使用下面的命令来完成安装:yum install vim
4.5.2 vim安装
命令: yum install vim
安装过程中,会有确认提示,此时输入 y,然后回车,继续安装:
4.5.3 vim使用
作用: 对文件内容进行编辑,vim其实就是一个文本编辑器 语法: vim fileName 说明: 1). 在使用vim命令编辑文件时,如果指定的文件存在则直接打开此文件。如果指定的文件不存在则新建文件。 2). vim在进行文本编辑时共分为三种模式,分别是 命令模式(Command mode),插入模式(Insert mode)和底行模式(Last line mode)。这三种模式之间可以相互切换。我们在使用vim时一定要注意我们当前所处的是哪种模式。
三种模式: - 命令模式 A. 命令模式下可以查看文件内容、移动光标(上下左右箭头、gg、G) B. 通过vim命令打开文件后,默认进入命令模式 C. 另外两种模式需要首先进入命令模式,才能进入彼此
<span style="background-color:#dadada"><span style="color:#1f0909"> | 命令模式指令 | 含义 |
| ------------ | --------------------------------- |
| gg | 定位到文本内容的第一行 |
| G | 定位到文本内容的最后一行 |
| dd | 删除光标所在行的数据 |
| ndd | 删除当前光标所在行及之后的n行数据 |
| u | 撤销操作 |
| shift+zz | 保存并退出 |
| i 或 a 或 o | 进入插入模式 |</span></span>
-
插入模式 A. 插入模式下可以对文件内容进行编辑 B. 在命令模式下按下[i,a,o]任意一个,可以进入插入模式。进入插入模式后,下方会出现【insert】字样 C. 在插入模式下按下ESC键,回到命令模式
-
底行模式 A. 底行模式下可以通过命令对文件内容进行查找、显示行号、退出等操作 B. 在命令模式下按下[:,/]任意一个,可以进入底行模式 C. 通过/方式进入底行模式后,可以对文件内容进行查找 D. 通过:方式进入底行模式后,可以输入wq(保存并退出)、q!(不保存退出)、set nu(显示行号)
底行模式命令 含义 :wq 保存并退出 :q! 不保存退出 :set nu 显示行号 :set nonu 取消行号显示 :n 定位到第n行, 如 :10 就是定位到第10行
操作示例:
4.6 查找命令
4.6.1 find
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 在指定目录下查找文件
语法: find dirName -option fileName
举例:
find . –name "*.java" 在当前目录及其子目录下查找.java结尾文件
find /itcast -name "*.java" 在/itcast目录及其子目录下查找.java结尾的文件</span></span>
操作示例:
4.6.2 grep
<span style="background-color:#dadada"><span style="color:#1f0909">作用: 从指定文件中查找指定的文本内容
语法: grep word fileName
举例:
grep Hello HelloWorld.java 查找HelloWorld.java文件中出现的Hello字符串的位置
grep hello *.java 查找当前目录中所有.java结尾的文件中包含hello字符串的位置</span></span>
操作示例:
1. 软件安装
1.1 软件安装方式
在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下:
安装方式 | 特点 |
---|---|
二进制发布包安装 | 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 |
rpm安装 | 软件已经按照redhat的包管理规范进行打包,使用rpm命令进行安装,==不能自行解决库依赖问题== |
yum安装 | 一种在线软件安装方式,本质上还是rpm安装,自动下载安装包并安装,安装过程中自动解决库依赖问题(安装过程需要联网) |
源码编译安装 | 软件以源码工程的形式发布,需要自己编译打包 |
1.2 安装JDK
上述我们介绍了Linux系统软件安装的四种形式,接下来我们就通过第一种(二进制发布包)形式来安装JDK。 JDK对应的二进制发布包,在课程资料中已经提供,如下:
JDK具体安装步骤如下:
1). 上传安装包
使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux
由于上述在进行文件上传时,选择的上传目录为根目录 /,上传完毕后,我们执行指令 cd / 切换到根目录下,查看上传的安装包。
2). 解压安装包
执行如下指令,将上传上来的压缩包进行解压,并通过-C参数指定解压文件存放目录为 /usr/local。
<span style="background-color:#dadada"><span style="color:#1f0909">tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local</span></span>
3). 配置环境变量
使用vim命令修改/etc/profile文件,在文件末尾加入如下配置
<span style="background-color:#dadada"><span style="color:#1f0909">JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH</span></span>
具体操作指令如下:
<span style="background-color:#dadada"><span style="color:#1f0909">1). 编辑/etc/profile文件,进入命令模式
vim /etc/profile
2). 在命令模式中,输入指令 G , 切换到文件最后
G
3). 在命令模式中输入 i/a/o 进入插入模式,然后切换到文件最后一行
i
4). 将上述的配置拷贝到文件中
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
5). 从插入模式,切换到指令模式
ESC
6). 按:进入底行模式,然后输入wq,回车保存
:wq</span></span>
4). 重新加载profile文件
为了使更改的配置立即生效,需要重新加载profile文件,执行命令:
<span style="background-color:#dadada"><span style="color:#1f0909">source /etc/profile</span></span>
5). 检查安装是否成功
<span style="background-color:#dadada"><span style="color:#1f0909">java -version</span></span>
1.3 安装Tomcat
1.3.1 Tomcat安装
Tomcat的安装和上述JDK的安装采用相同的方式,都是使用二进制发布包的形式进行安装,在我们的资料目录下,也已经准备了Tomcat的安装包:
具体安装步骤如下:
1). 上传安装包
使用FinalShell自带的上传工具将Tomcat的二进制发布包上传到Linux(与前面上传JDK安装包步骤一致)。
2). 解压安装包
将上传上来的安装包解压到指定目录/usr/local下,执行命令为
<span style="background-color:#dadada"><span style="color:#1f0909">tar -zxvf apache-tomcat-7.0.57.tar.gz -C /usr/local</span></span>
3). 启动Tomcat
进入Tomcat的bin目录启动服务。执行命令为:
<span style="background-color:#dadada"><span style="color:#1f0909">cd /usr/local/apache-tomcat-7.0.57/
cd bin
sh startup.sh或者./startup.sh</span></span>
1.3.2 Tomcat进程查看
上述我们将Tomcat启动完成之后,并不能知道Tomcat是否正常运行,那么我们验证Tomcat启动是否成功,有多种方式,我们这里主要介绍常见的两种方式:
1). 查看启动日志
Tomcat的启动日志输出在Tomcat的安装目录下的logs目录中,Tomcat的启动及运行日志文件名为 catalina.out,所以我们查看Tomcat启动日志,主要可以通过两条指令,如下:
<span style="background-color:#dadada"><span style="color:#1f0909">1). 分页查询Tomcat的日志信息
more /usr/local/apache-tomcat-7.0.57/logs/catalina.out
2). 查询日志文件尾部的50行记录
tail -50 /usr/local/apache-tomcat-7.0.57/logs/catalina.out</span></span>
只要Tomcat在启动的过程中,日志输出没有报错,基本可以判定Tomcat启动成功了。
2). 查询系统进程
我们也可以通过Linux系统的查看系统进程的指令,来判定Tomcat进程是否存在,从而判定Tomcat是否启动。执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">ps -ef|grep tomcat</span></span>
说明:
-
==ps==命令是linux下非常强大的进程查看命令,通过ps -ef可以查看当前运行的所有进程的详细信息
-
=="|"== 在Linux中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入
-
使用ps命令查看进程时,经常配合管道符和查找命令 grep 一起使用,来查看特定进程
1.3.3 防火墙操作
前面我们已经通过日志的方式及查看系统进程的方式,验证了Tomcat服务已经正常启动,接下来我们就可以尝试访问一下。访问地址:http://192.168.138.130:8080,我们发现是访问不到的。
那为什么tomcat启动成功了,但就是访问不到呢?原因就在于Linux系统的防火墙,系统安装完毕后,系统启动时,防火墙自动启动,防火墙拦截了所有端口的访问。接下来我们就需要学习一下,如何操作防火墙,具体指令如下:
操作 | 指令 | 备注 |
---|---|---|
查看防火墙状态 | systemctl status firewalld / firewall-cmd --state | |
暂时关闭防火墙 | systemctl stop firewalld | |
永久关闭防火墙(禁用开机自启) | systemctl disable firewalld | ==下次启动,才生效== |
暂时开启防火墙 | systemctl start firewalld | |
永久开启防火墙(启用开机自启) | systemctl enable 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 |
注意:
A. systemctl是管理Linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作
B. firewall-cmd是Linux中专门用于控制防火墙的命令
C. 为了保证系统安全,服务器的防火墙不建议关闭
那么我们要想访问到Tomcat,就可以采取两种类型的操作:
A. 关闭防火墙
执行指令 :
<span style="background-color:#dadada"><span style="color:#1f0909">systemctl stop firewalld</span></span>
关闭之后,再次访问Tomcat,就可以访问到了。
注意: 上面我们也提到了,直接关闭系统的防火墙,是不建议的,因为这样会造成系统不安全。
B. 开放Tomcat的端口号8080
执行指令:
<span style="background-color:#dadada"><span style="color:#1f0909">①. 先开启系统防火墙
systemctl start firewalld
②. 再开放8080端口号
firewall-cmd --zone=public --add-port=8080/tcp --permanent
③. 重新加载防火墙
firewall-cmd --reload</span></span>
执行上述的操作之后,就开放了当前系统中的8080端口号,再次访问Tomcat。
1.3.4 停止Tomcat
在Linux系统中,停止Tomcat服务的方式主要有两种:
1). 运行Tomcat提供的脚本文件
在Tomcat安装目录下有一个bin目录,这个目录中存放的是tomcat的运行脚本文件,其中有一个脚本就是用于停止tomcat服务的。
我们可以切换到bin目录,并执行如下指令,来停止Tomcat服务:
<span style="background-color:#dadada"><span style="color:#1f0909">sh shutdown.sh
./shutdown.sh</span></span>
2). 结束Tomcat进程
我们可以先通过 ps -ef|grep tomcat
指令查看tomcat进程的信息,从进程信息中获取tomcat服务的进程号。然后通过kill -9 的形式,来杀死系统进程。
通过上述的指令,我们可以获取到tomcat的进程号为 79947。接下来,我们就可以通过指令 ,来杀死tomcat的进程 :
<span style="background-color:#dadada"><span style="color:#1f0909">kill -9 79947 </span></span>
执行完上述指令之后,我们再访问Linux系统中的Tomcat,就访问不到了。
注意:
kill命令是Linux提供的用于结束进程的命令,-9表示强制结束
注意 :
虽然上述讲解的两种方式,都可以停止Tomcat服务,但是推荐使用第一种方式(./shutdown.sh)执行脚本来关闭tomcat服务,如果通过第一种方式停止不了tomcat了,这个时候,我们可以考虑使用第二种方式,强制杀死进程。
1.4 安装MySQL
1.4.1 MySQL安装
对于MySQL数据库的安装,我们将要使用前面讲解的第二种安装方式rpm进行安装。那么首先我们先了解一下什么rpm?
RPM:全称为 Red-Hat Package Manager,RPM软件包管理器,是红帽Linux用于管理和安装软件的工具。
我们要通过rpm,进行MySQL数据库的安装,主要的步骤如下:
1). 检测当前系统是否安装过MySQL相关数据库
需要通过rpm相关指令,来查询当前系统中是否存在已安装的mysql软件包,执行指令如下:
<span style="background-color:#dadada"><span style="color:#1f0909">rpm -qa 查询当前系统中安装的所有软件
rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件
rpm -qa | grep mariadb 查询当前系统中安装的名称带mariadb的软件</span></span>
通过rpm -qa 查询到系统通过rpm安装的所有软件,太多了,不方便查看,所以我们可以通过管道符 | 配合着grep进行过滤查询。
通过查询,我们发现在当前系统中存在mariadb数据库,是CentOS7中自带的,而这个数据库和MySQL数据库是冲突的,所以要想保证MySQL成功安装,需要卸载mariadb数据库。
2). 卸载现有的MySQL数据库
在rpm中,卸载软件的语法为:
<span style="background-color:#dadada"><span style="color:#1f0909">rpm -e --nodeps 软件名称</span></span>
那么,我们就可以通过指令,卸载 mariadb,具体指令为:
<span style="background-color:#dadada"><span style="color:#1f0909">rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64</span></span>
我们看到执行完毕之后, 再次查询 mariadb,就查不到了,因为已经被成功卸载了。
3). 将资料中提供的MySQL安装包上传到Linux并解压
A. 上传MySQL安装包
在课程资料中,提供的有MySQL的安装包 ,我们需要将该安装包上传到Linux系统的根目录 / 下面。
B. 解压到/usr/local/mysql
执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">mkdir /usr/local/mysql
tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql</span></span>
4). 安装顺序安装rpm安装包
<span style="background-color:#dadada"><span style="color:#1f0909">rpm <span style="color:#0000cc">-ivh</span> mysql-community-common-5.7.25-1.el7.x86_64.rpm
rpm <span style="color:#0000cc">-ivh</span> mysql-community-libs-5.7.25-1.el7.x86_64.rpm
rpm <span style="color:#0000cc">-ivh</span> mysql-community-devel-5.7.25-1.el7.x86_64.rpm
rpm <span style="color:#0000cc">-ivh</span> mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
rpm <span style="color:#0000cc">-ivh</span> mysql-community-client-5.7.25-1.el7.x86_64.rpm
yum install net-tools
rpm <span style="color:#0000cc">-ivh</span> mysql-community-server-5.7.25-1.el7.x86_64.rpm</span></span>
说明:
因为rpm安装方式,是不会自动处理依赖关系的,需要我们自己处理,所以对于上面的rpm包的安装顺序不能随意修改。
安装过程中提示缺少net-tools依赖,使用yum安装(yum是一种在线安装方式,需要保证联网)
可以通过指令(yum update)升级现有软件及系统内核
1.4.2 MySQL启动
MySQL安装完成之后,会自动注册为系统的服务,服务名为mysqld。那么,我们就可以通过systemctl指令来查看mysql的状态、启动mysql、停止mysql。
<span style="background-color:#dadada"><span style="color:#1f0909">systemctl status mysqld 查看mysql服务状态
systemctl start mysqld 启动mysql服务
systemctl stop mysqld 停止mysql服务</span></span>
说明:
可以设置开机时启动mysql服务,避免每次开机启动mysql。执行如下指令:
systemctl enable mysqld
我们可以通过如下两种方式,来判定mysql是否启动:
<span style="background-color:#dadada"><span style="color:#1f0909">netstat -tunlp 查看已经启动的服务
netstat -tunlp | grep mysql 查看mysql的服务信息
ps –ef | grep mysql 查看mysql进程</span></span>
备注:
A. netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。
参数说明:
-l或--listening:显示监控中的服务器的Socket; -n或--numeric:直接使用ip地址,而不通过域名服务器; -p或--programs:显示正在使用Socket的程序识别码和程序名称; -t或--tcp:显示TCP传输协议的连线状况; -u或--udp:显示UDP传输协议的连线状况;
B. ps命令用于查看Linux中的进程数据。
1.4.3 MySQL登录
1.4.3.1 查阅临时密码
MySQL启动起来之后,我们就可以测试一下登录操作,但是我们要想登录MySQL,需要一个访问密码,而刚才在安装MySQL的过程中,并没有看到让我们设置访问密码,那这个访问密码是多少呢? 那实际上,对于rpm安装的mysql,在mysql第一次启动时,会自动帮我们生成root用户的访问密码,并且输出在mysql的日志文件 /var/log/mysqld.log中,我们可以查看这份日志文件,从而获取到访问密码。
可以执行如下指令:
1). cat /var/log/mysqld.log
这种方式,可以看到所有的日志数据,文件比较大时,很不方便查看数据。我们可以通过管道符 | 配合grep来对数据进行过滤。
2). cat /var/log/mysqld.log | grep password
我们可以通过上述指令,查询日志文件内容中包含password的行信息。
1.4.3.2 登录MySQL
获取到root用户的临时密码之后,我们就可以登录mysql数据库,修改root的密码,为root设置一个新的密码。并且我们还需要开启root用户远程访问该数据库的权限,这样的话,我们就可以在windows上来访问这台MySQL数据库。
执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">①. 登录mysql(复制日志中的临时密码登录)
mysql -uroot -p
②. 修改密码
set global validate_password_length=4; 设置密码长度最低位数
set global validate_password_policy=LOW; 设置密码安全等级低,便于密码可以修改成root
set password = password('root'); 设置密码为root
③. 开启访问权限
grant all on *.* to 'root'@'%' identified by 'root';
flush privileges;</span></span>
操作完上述的指令之后,数据库root用户的密码以及远程访问我们就配置好了,接下来,可以执行exit退出mysql,再次通过新的密码进行登录。
当然我们也可以使用安装在windows系统中的sqlyog或者Navicat来远程连接linux上的MySQL。
==注意: 要想在windows上能够访问MySQL,还需要开放防火墙的3306端口,执行如下指令:==
<span style="background-color:#dadada"><span style="color:#1f0909">firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload</span></span>
1.5 安装lrzsz
lrzsz 是用于在Linux系统中文件上传下载的软件。大家可能会存在疑问,我们用finalShell图形化界面就可以很方便的完成上传下载,为什么还要使用这个软件来完成上传下载呢?实际上是这样的,Linux的远程连接工具有很多,而finalShell只是其中的一种,而还有很多的远程连接工具并没有上传下载的功能,这个时候就需要依赖于lrzsz这个软件了。
对于lrzsz的安装,我们需要通过第三种软件安装方式yum来进行安装。这里,我们先对yum做一个简单介绍。
Yum: (Yellow dog Updater,Modified),是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
安装lrzsz的步骤如下:
1). 搜索lrzsz安装包
<span style="background-color:#dadada"><span style="color:#1f0909">yum list lrzsz</span></span>
2). 在线安装lrzsz
<span style="background-color:#dadada"><span style="color:#1f0909">yum install lrzsz.x86_64</span></span>
3). 测试
在命令行中输入 rz , 就会自动打开一个文件选择的窗口,然后选择要上传的文件。
yum拓展知识:
1). 如果在不更改软件来源的情况下,是需要联网才能使用yum的,那么我们安装的软件是从哪儿下载的呢,这里就涉及到一个概念: yum源。
2). 我们可以通过一个指令,来检查当前的yum源
从图中,我们可以看到我们安装的 CentOS7 采用的是网易的163yum源。
3). 网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"
可以看到,该目录下有 7 个 yum 配置文件,通常情况下 CentOS-Base.repo 文件生效。
4). 添加阿里云yum源
A. 先通过
yum install wget
,安装wget命令B. 备份默认的网易163的yum源,执行指令 :
切换目录: cd /etc/yum.repos.d/
创建备份目录: mkdir bak
移动现有的yum源文件到bak: mv *.repo bak/
C. 下载阿里云的yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
D. 执行命令,重新生成cache
yum clean all
yum makecache
E. 再次查看yum源
之后,我们通过yum指令安装软件,就是从阿里云下载的。
2. 项目部署
之前我们讲解Linux操作系统时,就提到,我们服务端开发工程师学习Linux系统的目的就是将来我们开发的项目绝大部分情况下都需要部署在Linux系统中。那么在本章节,我们将通过两种方式,来演示项目部署,分别是:手动部署项目 和 基于shell脚本自动部署。
2.1 手动部署项目
1). 在IDEA中开发SpringBoot项目并打成jar包
项目是一个很简单的springboot项目(可以自己开发一个,也可以直接导入资料中提供的),结构如下:
可以在本地的idea中先启动当前的demo工程,然后访问一下,看看工程是否正常访问。
执行package指令,进行打包操作,将当前的springboot项目,打成一个jar包。
2). 将jar包上传到Linux服务器
通过 rz 指令,将打好的jar包上传至Linux服务器的 /usr/local/app 目录下。 先执行指令创建app目录。
<span style="background-color:#dadada"><span style="color:#1f0909">A. 在/usr/local下创建目录app
mkdir /usr/local/app
B. 切换到app目录下
cd /usr/local/app
C. 执行指令,进行jar包上传
rz</span></span>
此时这个jar包就上传到 /usr/local/app 目录了。
3). 启动SpringBoot程序
由于我们的项目已经打成jar包上传上来到Linux服务器,我们只需要运行这个jar包项目就启动起来了,所以只需要执行如下指令即可:
<span style="background-color:#dadada"><span style="color:#1f0909">java -jar helloworld-1.0-SNAPSHOT.jar</span></span>
==注意: 由于前面安装的Tomcat在启动时,会占用端口号8080,而当前springboot项目我们没有配置端口号,默认也是8080,所以我们要想启动springboot项目,需要把之前运行的Tomcat停止掉。==
4). 检查防火墙,确保8080端口对外开放,访问SpringBoot项目
<span style="background-color:#dadada"><span style="color:#1f0909">firewall-cmd --zone=public --list-ports</span></span>
如果防火墙没有放开8080端口,还需要放开对应的端口号,执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">firewall-cmd --zone=public --add-port=8080/tcp --permanent</span></span>
5). 访问测试
http://192.168.138.130:8080/hello
6). 后台运行项目
当前这个demo工程我们已经部署成功了,并且我们也可以访问项目了。但是这个工程目前是存在问题的,就是当前我们项目启动的这个窗口被霸屏占用了,如果我们把这个窗口关闭掉(或ctrl+c),当前服务也就访问不到了,我们可以试一下。
目前程序运行的问题:
A. 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
B. 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
后台运行程序:
要想让我们部署的项目进行后台运行,这个时候我们需要使用到linux中的一个命令 nohup ,接下来,就来介绍一下nohup命令。
nohup命令:英文全称 no hang up(不挂起),用于不挂断地运行指定命令,退出终端不会影响程序的运行
语法格式: nohup Command [ Arg … ] [&]
参数说明:
Command:要执行的命令
Arg:一些参数,可以指定输出文件
&:让命令在后台运行
举例:
nohup java -jar boot工程.jar &> hello.log &
上述指令的含义为: 后台运行 java -jar 命令,并将日志输出到hello.log文件
那么经过上面的介绍,我们可以推测中,我们要想让当前部署的项目后台运行,就可以使用下面的指令:
<span style="background-color:#dadada"><span style="color:#1f0909">nohup java -jar helloworld-1.0-SNAPSHOT.jar &> hello.log &</span></span>
这样的话,我们的项目就已经启动成功了,我们可以通过ps指令,查看到系统的进程。
接下来,我们再次访问我们的项目,来看看服务是否可用。
7). 停止SpringBoot项目
2.2 基于Shell脚本自动部署
2.2.1 介绍
前面介绍的项目部署是手动部署,也就是部署过程中的每一步操作都需要我们手动操作。接下来,我们需要再讲解一下项目的自动部署,从而来简化项目部署的操作,那么我们先来整体上了解一下项目自动部署的流程及操作步骤。
操作步骤如下:
1). 在Gitee上创建远程仓库,并将本地的项目代码推送到远程仓库中
2). 在Linux中安装Git,克隆代码
3). 在Linux中安装maven
4). 编写Shell脚本(拉取代码、编译、打包、启动)
5). 为用户授予执行Shell脚本的权限
6). 执行Shell脚本
2.2.2 推送代码到远程
这部分操作,大家只需要参考之前讲解的Git,来完成helloworld工程代码推送即可。
A. 创建远程仓库
B. 将idea中的代码提交并推送到远程仓库
2.2.3 Git操作
1). Git软件安装
通过yum命令在线安装git,执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">yum list git 列出git安装包
yum install git 在线安装git</span></span>
通过上述指令,安装好git之后,我们就可以通过 git --version去验证git的环境。
2). Git克隆代码
<span style="background-color:#dadada"><span style="color:#1f0909">cd /usr/local/
git clone https://gitee.com/ChuanZhiBoKe/helloworld.git</span></span>
2.2.4 Maven安装
由于我们的工程是maven工程,我们要想进行项目的编译打包,需要用到maven的指令,所以需要安装maven。具体操作步骤如下:
1). 上传资料中提供的maven的安装包
通过rz指令上传课程资料中的maven安装包
2). 解压maven安装包到/usr/local目录
<span style="background-color:#dadada"><span style="color:#1f0909">tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local</span></span>
3). 在/etc/profile配置文件中配置环境变量
<span style="background-color:#dadada"><span style="color:#1f0909">vim /etc/profile
修改配置文件,进入到命令模式,按G切换到最后一行,按a/i/o进入插入模式,然后在最后加入如下内容 :
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
然后按ESC进入到命令模式,输入 :wq 保存并退出</span></span>
要想让配置的环境变量生效,还需要执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">source /etc/profile</span></span>
4). 修改maven的settings.xml配置文件,配置本地仓库地址
A. 切换目录
<span style="background-color:#dadada"><span style="color:#1f0909">cd /usr/local/apache-maven-3.5.4/conf</span></span>
B. 编辑settings.xml配置文件
<span style="background-color:#dadada"><span style="color:#1f0909">vim settings.xml</span></span>
在其中增加如下配置,配置本地仓库地址:
<span style="background-color:#dadada"><span style="color:#1f0909"><localRepository>/usr/local/repo</localRepository></span></span>
并在settings.xml中的<mirrors>标签中,配置阿里云的私服(==选做==):
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#117700"><</span><span style="color:#117700">mirror</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span><span style="color:#117700">></span>alimaven<span style="color:#117700"></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">mirrorOf</span><span style="color:#117700">></span>central<span style="color:#117700"></</span><span style="color:#117700">mirrorOf</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">name</span><span style="color:#117700">></span>aliyun maven<span style="color:#117700"></</span><span style="color:#117700">name</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">url</span><span style="color:#117700">></span>http://maven.aliyun.com/nexus/content/groups/public/<span style="color:#117700"></</span><span style="color:#117700">url</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">mirror</span><span style="color:#117700">></span> </span></span>
2.2.5 Shell脚本准备
Shell脚本(shell script),是一种Linux系统中的脚本程序。使用Shell脚本编程跟 JavaScript、Java编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
对于Shell脚本编写不作为本课程重点内容,直接使用课程资料中提供的脚本文件bootStart.sh即可。
在/usr/local/目录下创建一个目录 sh(mkdir sh),并将shell脚本上传到该目录下。或者直接在sh目录下创建一个脚本bootStart.sh,然后将资料中的bootStart.sh文件打开,内容拷贝过来即可。
脚本解读:
2.2.6 Linux权限
前面我们已经把Shell脚本准备好了,但是Shell脚本要想正常的执行,还需要给Shell脚本分配执行权限。 由于linux系统是一个多用户的操作系统,并且针对每一个用户,Linux会严格的控制操作权限。接下来,我们就需要介绍一下Linux系统的权限控制。
1). ==chmod==(英文全拼:change mode)命令是控制用户对文件的权限的命令
2). Linux中的权限分为三种 :读(r)、写(w)、执行(x)
3). Linux文件权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)
4). 只有文件的所有者和超级用户可以修改文件或目录的权限
5). 要执行Shell脚本需要有对此脚本文件的执行权限(x),如果没有则不能执行
Linux系统中权限描述如下:
解析当前脚本的权限情况:
chmod命令可以使用八进制数来指定权限(0 - 代表无 , 1 - 执行x , 2 - 写w , 4 - 读r):
值 | 权限 | RWX |
---|---|---|
7 | 读 + 写 + 执行 | rwx |
6 | 读 + 写 | rw- |
5 | 读 + 执行 | r-x |
4 | 只读 | r-- |
3 | 写 + 执行 | -wx |
2 | 只写 | -w- |
1 | 只执行 | --x |
0 | 无 | --- |
举例:
<span style="background-color:#dadada"><span style="color:#1f0909">chmod 777 bootStart.sh 为所有用户授予读、写、执行权限
chmod 755 bootStart.sh 为文件拥有者授予读、写、执行权限,同组用户和其他用户授予读、执行权限
chmod 210 bootStart.sh 为文件拥有者授予写权限,同组用户授予执行权限,其他用户没有任何权限</span></span>
==注意:==
三个数字分别代表不同用户的权限
-
第1位表示文件拥有者的权限
-
第2位表示同组用户的权限
-
第3位表示其他用户的权限
2.2.7 授权并执行脚本
在测试阶段,我们可以给所有的人都赋予执行该shell脚本的权限。所以可以执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">chmod 777 bootStart.sh</span></span>
权限解读:
A. 第一个7,代表当前文件所有者root用户,对该文件具有读写执行权限;
B. 第二个7,代表当前文件所有者所属组的用户,对该文件具有读写执行权限;
B. 第三个7,代表其他用户,对该文件具有读写执行权限;
执行该shell脚本:
==注意: 在执行maven指令进行打包时,第一次执行可能会耗时比较长,因为在进行maven工程的打包时,需要到中央仓库下载工程依赖的jar包和插件(可以在settings.xml中配置阿里云私服加速下载)。==
启动完成之后, 我们可以查看java进程:
访问项目:
2.2.8 设置静态IP
我们目前安装的Linux操作系统,安装完毕之后并没有配置IP地址,默认IP地址是动态获取的,那如果我们使用该Linux服务器部署项目,IP动态获取的话,也就意味着,IP地址可能会发生变动,那我们访问项目的话就会非常繁琐,所以作为服务器,我们一般还需要把IP地址设置为静态的。
1). 设置静态IP
设置静态ip,我们就需要修改 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件,内容如下:
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#0000ff">TYPE</span>=<span style="color:#009900">Ethernet</span>
<span style="color:#0000ff">PROXY_METHOD</span>=<span style="color:#009900">none</span>
<span style="color:#0000ff">BROWSER_ONLY</span>=<span style="color:#009900">no</span>
<span style="color:#0000ff">BOOTPROTO</span>=<span style="color:#009900">static</span>
<span style="color:#0000ff">IPADDR</span>=<span style="color:#009900">"192.168.138.100" # 设置的静态IP地址</span>
<span style="color:#0000ff">NETMASK</span>=<span style="color:#009900">"255.255.255.0" # 子网掩码</span>
<span style="color:#0000ff">GATEWAY</span>=<span style="color:#009900">"192.168.138.2" # 网关地址</span>
<span style="color:#0000ff">DNS1</span>=<span style="color:#009900">"192.168.138.2" # DNS服务器</span>
<span style="color:#0000ff">DEFROUTE</span>=<span style="color:#009900">yes</span>
<span style="color:#0000ff">IPV4_FAILURE_FATAL</span>=<span style="color:#009900">no</span>
<span style="color:#0000ff">IPV6INIT</span>=<span style="color:#009900">yes</span>
<span style="color:#0000ff">IPV6_AUTOCONF</span>=<span style="color:#009900">yes</span>
<span style="color:#0000ff">IPV6_DEFROUTE</span>=<span style="color:#009900">yes</span>
<span style="color:#0000ff">IPV6_FAILURE_FATAL</span>=<span style="color:#009900">no</span>
<span style="color:#0000ff">IPV6_ADDR_GEN_MODE</span>=<span style="color:#009900">stable-privacy</span>
<span style="color:#0000ff">NAME</span>=<span style="color:#009900">ens33</span>
<span style="color:#0000ff">UUID</span>=<span style="color:#009900">afd0baa3-8bf4-4e26-8d20-5bc426b75fd6</span>
<span style="color:#0000ff">DEVICE</span>=<span style="color:#009900">ens33</span>
<span style="color:#0000ff">ONBOOT</span>=<span style="color:#009900">yes</span>
<span style="color:#0000ff">ZONE</span>=<span style="color:#009900">public</span></span></span>
上述我们所设置的网段为138,并不是随意指定的,需要和我们虚拟机中的虚拟网络编辑器中的NAT模式配置的网关保持一致。
2). 重启网络服务
ip地址修改完毕之后,需要重启网络服务,执行如下指令:
<span style="background-color:#dadada"><span style="color:#1f0909">systemctl restart network</span></span>
==注意:重启完网络服务后ip地址已经发生了改变,此时FinalShell已经连接不上Linux系统,需要创建一个新连接才能连接到Linux。==
再次连接上Linux之后,我们再次查看IP地址,就可以看到我们所设置的静态IP:
Linux
解决乱码问题:
echo 'LANG="en_US.UTF-8"' >> /etc/profile source /etc/profile
linux查看内存使用情况
linux常见命令
ls 查看当前目录下的内容
pwd 查看当前所在目录
cd [目录名] 切换目录
touch [文件名] 如果文件不存在,新建文件 mkdir [目录名] 创建目录
rm [文件名] 删除指定文件
clear 清屏
ll 代替ls -l
cd ..切换到当前目录的上级目录
cd ~切换搭配用户的home目录
cd /usr/local 切换到/usr/local 目录
cat 用于显示文件内容 cat [-n] fileName -n表示有1开始对所有输出的行数编号 cat /etc/profile
more 一分也的形式显示文件内容 语法 more fileName
回车键 向下滚动一行 空格键 向下滚动一屏
b 返回上一屏 q或者ctrl+c 退出more more /etc/profile
tail 查看文件末尾的内容
-f动态读取文件末尾内容并显示,通常用于日志文件的内容输出
tail /etc/profile 显示文件末尾10行的内容
tail 20 /etc/profile 显示文件末尾20行的内容
tail -f /itcast/my.log 动态读取文件末尾内容并显示
mkdir 创建目录
-p 确保目录名称存在,不存在就创建一个,通过次选项,可以实现多层目录同时创建
mkdir -p itcast/test 在工作目录下的itcast目录中建立一个名为test的子目录
rmdir 删除空目录
rmdir [-p] dirName
-p 当子目录被删除后使父目录为空目录的话,则一并删除
rmdir itcast* 删除名称以itcast开始的空目录
rm [-rf] name 删除问价或目录
-r 将文件及目录中所有文件(目录)逐一删除。即递归删除
-f无需确认直接删除
cp 用于复制文件或目录
cp [-r] source dest
-r 如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
cp hello.txt itcast/ 将文件复制到itcast目录中
cp hello.txt ./hi.txt 将文件复制到当前目录,并改名为hi.txt
cp -r itcast/ ./itheima/ 将itcast目录和目录下所有文件复制到itheima目录下
cp -r itcast/* ./itheima/ 将itcast目录下所有文件复制到itheima目录下
mv 为文件或目录改名,或将文件或目录移动到其他位置
mv source dest
mv hello.txt hi.txt 将文件改名为hi.txt
mv hi.txt itheima/ 将文件移动到itheima目录下
mv hi.txt itheima/helo.txt 将文件移动到itheima目录下,并改名为hello.txt
mv itcast itheima/ 如果itheima目录不存在,将itcast目录改名为itheima
mv itcast itheima/ 如果itheima目录存在,将目录移动到itheima目录中
tar 对文件进行打包,解包,压缩,解压
包文件后缀为.tar表示只完成了打包,并没有压缩
包文件后缀为.tar.gz表示打包的同时还进行了压缩
-z 代表的是gzip,通过gzip命令处理文件,gzip可以对文件压缩或者解压
-c 创建新的包文件
-x实现从包文件中还原文件
-v显示命令的执行过程
-f用于指定包文件的名称
vi 命令是linux系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于windows中的记事本 vi fileName
vim 是从vi发展来的一个功能更加强大的文本编辑工具,在编辑文件时可以对文本内容进行着色方便我们对文件进行编辑处理,所以实际工作中vim更加常用
要使用vim命令,需要我们自己完成安装,安装命令 yum install vim
vim 对文件内容进行编辑
在使用vim命令编辑文件时,如果指定的文件不存在则直接打开此文件,如果指定的文件不存在时则创建文件
vim在进行文本编辑时共分为三种模式,分别是命令模式,插入模式和底行模式,这三种模式之间可以相互切换,一定要注意在使用时我们在哪种模式
命令模式下可以查看文件内容,移动光标(上下左右箭头,gg,G)
通过vim命令后默认进入命令模式,另外另种需要首先命令模式,才能切换
插入模式可以进行编辑,命令模式下[i,a,o] 任意一个都可以切换,esc键返回
底行模式,通过命令对文件内容进行查找,显示行号,退出等操作
命令模式下[:,/]任意一个进入底行模式
通过/ 方式进入后可以对文件内容进行查找
通过:方式进入后wq(保存并退出) q!(不保存退出) set nu(显示行号)
find 在指定目录下查找文件
find dirName -option fileName
find . -anme “*.java” 在当前目录及其子目录下查找.java 结尾文件
find /itcast -name “*.java” 在itcast 目录及其子目录下查找.java结尾的文件
grep 从指定文件中查找指定的文本内容
grep word fileName
grep Hello HelloWord.java 查找HelloWord.java 文件中出现的hello字符串的位置
grep hello *.java 查找当前目录中所有.java结尾的文件中包含hello字符串的位置
ps -ef | grep tomcat 查看进程
ps 命令是linux下非常强大的进程查看命令,通过ps -ef 可以查看当前运行的所有进程的详细信息
| 在linux中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入
在使用ps命令查看进程时,经常配合管道符合查找命令grep一起使用,来查看特定进程
防火墙
systemctl status firewalld firewall-cmd --state 查看防火墙状态
systemctl stop 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 查看开放的端口
kill -9 -端口号 结束进程 kill命令是linux提供的用于结束进程的命令,-9表示强制结束
rpm -qa 查询当前系统中安装的所有软件
rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件
rpm -qa | grep mariadb 查询当前系统中安装的名称带mariadb的软件
rpm -e --nodeps 软件名称 卸载软件
yum update升级现有软件及系统内核
linux-mysql
systemctl status mysqld 查看mysql服务状态
systemctl start mysqld 启动mysql服务
systemctl enable mysqld 开机启动mysql服务
netstat -tunlp查看已经启动的服务
netstat -tunlp | grep mysql
ps -ef | grep mysql 查看mysql进程
cat /var/log/mysqld.log 查看文件内容
cat /var/log/mysqld.log |grep password 查看文件内容中包含password的行信息
mysql -uroot -p 登录mysql(使用临时密码登录)
修改密码
set global validate_password_length=4; 设置密码长度最低位数
set global validate_password_policy=LOW; 设置密码安全等级低,便于密码可以修改成root
set password = password('root'); 设置密码为root
开启访问权限
grant all on * . * to ‘root’@’%‘ identified by ‘root’;
flush privileges;
搜索lrzsz安装包 yum list lrzsz
在线安装lrzsz yum install lrzsz.x86_64
nohub java -jar boot工程.jar &> hello.log & 后台运行java.jar命令,并将日志输出到hello.log文件
nohub Command [Arg...] [&] Command:要执行的命令
Arg :一些参数,可以指定输出文件 &:让命令行在后台运行
停止SpringBoot程序
获取进程端口号ps -ef | grerp ‘java -jar’
结束进程 kill -9 端口号
修改配置
vim /etc/profile 更改文件 source /etc/profile 刷新配置
为文件授权
chmod 777 bootStart.sh 为所有用户授予读、写、执行权限
chmod 755 bootStart.sh 为文件拥有者授予读,写,执行权限,同组用户和其他用户授予读,执行权限
chmod 210 bootStart.sh 为文件拥有者授予写权限,同组用户授予执行权限,其他用于没有任何权限
第1位表示文件拥有者的权限
第2位表示同组用户的权限
第3位表示其他用户的权限
7 读+写+执行 6rw- 5r-x 4r-- 3-wx 2-w- 1--x 0---
Redis基础
课程内容
-
Redis入门
-
Redis数据类型
-
Redis常用命令
-
在Java中操作Redis
1. 前言
1.1 什么是Redis
Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
- 企业应用广泛
1.2 使用Redis能做什么
-
数据缓存
-
消息队列
-
注册中心
-
发布订阅
2. Redis入门
2.1 Redis简介
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻译为:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。
NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
关系型数据库(RDBMS):
-
Mysql
-
Oracle
-
DB2
-
SQLServer
非关系型数据库(NoSql):
-
Redis
-
Mongo db
-
MemCached
2.2 Redis下载与安装
2.2.1 Redis下载
Redis安装包分为windows版和Linux版:
-
Windows版下载地址:Releases · microsoftarchive/redis · GitHub
-
Linux版下载地址: Index of /releases/
下载后得到下面安装包:
2.2.2 Redis安装
1)在Linux中安装Redis
在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==
安装后重点文件说明:
/usr/local/redis-4.0.0/src/redis-server:Redis服务启动脚本
/usr/local/redis-4.0.0/src/redis-cli:Redis客户端脚本
/usr/local/redis-4.0.0/redis.conf:Redis配置文件
2)在Windows中安装Redis
Redis的Windows版属于绿色软件,直接解压即可使用,解压后目录结构如下:
2.3 Redis服务启动与停止
1)Linux系统中启动和停止Redis
执行Redis服务启动脚本文件==redis-server==:
通过启动日志可以看到,Redis默认端口号为==6379==。
==Ctrl + C==停止Redis服务
通过==redis-cli==可以连接到本地的Redis服务,默认情况下不需要认证即可连接成功。
退出客户端可以输入==exit==或者==quit==命令。
2)Windows系统中启动和停止Redis
Windows系统中启动Redis,直接双击redis-server.exe即可启动Redis服务,redis服务默认端口号为6379
==Ctrl + C==停止Redis服务
双击==redis-cli.exe==即可启动Redis客户端,默认连接的是本地的Redis服务,而且不需要认证即可连接成功。
退出客户端可以输入==exit==或者==quit==命令。
2.4 Redis配置文件
前面我们已经启动了Redis服务,默认情况下Redis启动后是在前台运行,而且客户端不需要密码就可以连接到Redis服务。如果我们希望Redis服务启动后是在后台运行,同时希望客户端认证通过后才能连接到Redis服务,应该如果做呢?
此时就需要修改Redis的配置文件:
-
Linux系统中Redis配置文件:REDIS_HOME/redis.conf
-
Windows系统中Redis配置文件:REDIS_HOME/redis.windows.conf
通过修改Redis配置文件可以进行如下配置:
1)设置Redis服务后台运行
将配置文件中的==daemonize==配置项改为yes,默认值为no。
注意:Windows版的Redis不支持后台运行。
2)设置Redis服务密码
将配置文件中的 ==# requirepass foobared== 配置项取消注释,默认为注释状态。foobared为密码,可以根据情况自己指定。
3)设置允许客户端远程连接Redis服务
Redis服务默认只能客户端本地连接,不允许客户端远程连接。将配置文件中的 ==bind 127.0.0.1== 配置项注释掉。
解释说明:
Redis配置文件中 ==#== 表示注释
Redis配置文件中的配置项前面不能有空格,需要顶格写
daemonize:用来指定redis是否要用守护线程的方式启动,设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行
requirepass:设置Redis的连接密码
bind:如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求。
注意:修改配置文件后需要重启Redis服务配置才能生效,并且启动Redis服务时需要显示的指定配置文件:
1)Linux中启动Redis服务
<span style="background-color:#dadada"><span style="color:#1f0909"># 进入Redis安装目录
cd /usr/local/redis-4.0.0
# 启动Redis服务,指定使用的配置文件
./src/redis-server ./redis.conf</span></span>
2)Windows中启动Redis服务
由于Redis配置文件中开启了认证校验,即客户端连接时需要提供密码,此时客户端连接方式变为:
解释说明:
-h:指定连接的Redis服务的ip地址
-p:指定连接的Redis服务的端口号
-a:指定连接的Redis服务的密码
3. Redis数据类型
3.1 介绍
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
-
字符串 string
-
哈希 hash
-
列表 list
-
集合 set
-
有序集合 sorted set / zset
3.2 Redis 5种常用数据类型
解释说明:
字符串(string):普通字符串,常用
哈希(hash):适合存储对象
列表(list):按照插入顺序排序,可以有重复元素
集合(set):无序集合,没有重复元素
有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
4. Redis常用命令
4.1 字符串string操作命令
Redis 中字符串类型常用命令:
-
SET key value 设置指定key的值
-
GET key 获取指定key的值
-
SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒
-
SETNX key value 只有在 key 不存在时设置 key 的值
更多命令可以参考Redis中文网:https://www.redis.net.cn
4.2 哈希hash操作命令
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
-
HSET key field value 将哈希表 key 中的字段 field 的值设为 value
-
HGET key field 获取存储在哈希表中指定字段的值
-
HDEL key field 删除存储在哈希表中的指定字段
-
HKEYS key 获取哈希表中所有字段
-
HVALS key 获取哈希表中所有值
-
HGETALL key 获取在哈希表中指定 key 的所有字段和值
4.3 列表list操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
-
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
-
LRANGE key start stop 获取列表指定范围内的元素
-
RPOP key 移除并获取列表最后一个元素
-
LLEN key 获取列表长度
-
BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止
4.4 集合set操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
-
SADD key member1 [member2] 向集合添加一个或多个成员
-
SMEMBERS key 返回集合中的所有成员
-
SCARD key 获取集合的成员数
-
SINTER key1 [key2] 返回给定所有集合的交集
-
SUNION key1 [key2] 返回所有给定集合的并集
-
SDIFF key1 [key2] 返回给定所有集合的差集
-
SREM key member1 [member2] 移除集合中一个或多个成员
4.5 有序集合sorted set操作命令
Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
常用命令:
-
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
-
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
-
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
-
ZREM key member [member ...] 移除有序集合中的一个或多个成员
4.6 通用命令
Redis中的通用命令,主要是针对key进行操作的相关命令:
-
KEYS pattern 查找所有符合给定模式( pattern)的 key
-
EXISTS key 检查给定 key 是否存在
-
TYPE key 返回 key 所储存的值的类型
-
TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
-
DEL key 该命令用于在 key 存在是删除 key
5. 在Java中操作Redis
5.1 介绍
前面我们讲解了Redis的常用命令,这些命令是我们操作Redis的基础,那么我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。
Redis 的 Java 客户端很多,官方推荐的有三种:
-
Jedis
-
Lettuce
-
Redisson
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。
5.2 Jedis
Jedis 是 Redis 的 Java 版本的客户端实现。
maven坐标:
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>redis.clients<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>jedis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.8.0<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>
使用 Jedis 操作 Redis 的步骤:
-
获取连接
-
执行操作
-
关闭连接
示例代码:
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">test</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">junit</span>.<span style="color:#000000">Test</span>;
<span style="color:#770088">import</span> <span style="color:#000000">redis</span>.<span style="color:#000000">clients</span>.<span style="color:#000000">jedis</span>.<span style="color:#000000">Jedis</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">util</span>.<span style="color:#000000">Set</span>;
<span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 使用Jedis操作Redis</span>
<span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">JedisTest</span> {
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">testRedis</span>(){
<span style="color:#aa5500">//1 获取连接</span>
<span style="color:#000000">Jedis</span> <span style="color:#000000">jedis</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Jedis</span>(<span style="color:#aa1111">"localhost"</span>,<span style="color:#116644">6379</span>);
<span style="color:#aa5500">//2 执行具体的操作</span>
<span style="color:#000000">jedis</span>.<span style="color:#000000">set</span>(<span style="color:#aa1111">"username"</span>,<span style="color:#aa1111">"xiaoming"</span>);
<span style="color:#008855">String</span> <span style="color:#000000">value</span> <span style="color:#981a1a">=</span> <span style="color:#000000">jedis</span>.<span style="color:#000000">get</span>(<span style="color:#aa1111">"username"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">value</span>);
<span style="color:#aa5500">//jedis.del("username");</span>
<span style="color:#000000">jedis</span>.<span style="color:#000000">hset</span>(<span style="color:#aa1111">"myhash"</span>,<span style="color:#aa1111">"addr"</span>,<span style="color:#aa1111">"bj"</span>);
<span style="color:#008855">String</span> <span style="color:#000000">hValue</span> <span style="color:#981a1a">=</span> <span style="color:#000000">jedis</span>.<span style="color:#000000">hget</span>(<span style="color:#aa1111">"myhash"</span>, <span style="color:#aa1111">"addr"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">hValue</span>);
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">keys</span> <span style="color:#981a1a">=</span> <span style="color:#000000">jedis</span>.<span style="color:#000000">keys</span>(<span style="color:#aa1111">"*"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">key</span> : <span style="color:#000000">keys</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">key</span>);
}
<span style="color:#aa5500">//3 关闭连接</span>
<span style="color:#000000">jedis</span>.<span style="color:#000000">close</span>();
}
}</span></span>
5.3 Spring Data Redis
5.3.1 介绍
Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
maven坐标:
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.data<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-data-redis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.4.8<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>
Spring Boot提供了对应的Starter,maven坐标:
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-data-redis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
-
ValueOperations:简单K-V操作
-
SetOperations:set类型数据操作
-
ZSetOperations:zset类型数据操作
-
HashOperations:针对hash类型的数据操作
-
ListOperations:针对list类型的数据操作
5.3.2 使用方式
5.3.2.1 环境搭建
第一步:创建maven项目springdataredis_demo,配置pom.xml文件
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">project</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0"</span>
<span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>4.0.0<span style="color:#117700"></</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-parent<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.4.5<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">relativePath</span><span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>com.itheima<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>springdataredis_demo<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.0-SNAPSHOT<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">java.version</span><span style="color:#117700">></span>1.8<span style="color:#117700"></</span><span style="color:#117700">java.version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-test<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>test<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-data-redis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">build</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-maven-plugin<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.4.5<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">build</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">project</span><span style="color:#117700">></span></span></span>
第二步:编写启动类
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">SpringApplication</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">autoconfigure</span>.<span style="color:#000000">SpringBootApplication</span>;
<span style="color:#555555">@SpringBootApplication</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">App</span> {
<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
<span style="color:#000000">SpringApplication</span>.<span style="color:#000000">run</span>(<span style="color:#000000">App</span>.<span style="color:#770088">class</span>,<span style="color:#000000">args</span>);
}
}</span></span>
第三步:配置application.yml
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#221199">spring</span><span style="color:#555555">:</span>
<span style="color:#221199"> application</span><span style="color:#555555">:</span>
<span style="color:#221199"> name</span><span style="color:#555555">: </span>springdataredis_demo
<span style="color:#aa5500">#Redis相关配置</span>
<span style="color:#221199"> redis</span><span style="color:#555555">:</span>
<span style="color:#221199"> host</span><span style="color:#555555">: </span>localhost
<span style="color:#221199"> port</span><span style="color:#555555">: </span><span style="color:#116644">6379</span>
<span style="color:#aa5500">#password: 123456</span>
<span style="color:#221199"> database</span><span style="color:#555555">: </span>0 <span style="color:#aa5500">#操作的是0号数据库</span>
<span style="color:#221199"> jedis</span><span style="color:#555555">:</span>
<span style="color:#aa5500">#Redis连接池配置</span>
<span style="color:#221199"> pool</span><span style="color:#555555">:</span>
<span style="color:#221199"> max-active</span><span style="color:#555555">: </span>8 <span style="color:#aa5500">#最大连接数</span>
<span style="color:#221199"> max-wait</span><span style="color:#555555">: </span>1ms <span style="color:#aa5500">#连接池最大阻塞等待时间</span>
<span style="color:#221199"> max-idle</span><span style="color:#555555">: </span>4 <span style="color:#aa5500">#连接池中的最大空闲连接</span>
<span style="color:#221199"> min-idle</span><span style="color:#555555">: </span>0 <span style="color:#aa5500">#连接池中的最小空闲连接</span></span></span>
解释说明:
spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。
可以通过修改Redis配置文件来指定数据库的数量。
第四步:提供配置类
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">config</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">cache</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">CachingConfigurerSupport</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Bean</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Configuration</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">data</span>.<span style="color:#000000">redis</span>.<span style="color:#000000">connection</span>.<span style="color:#000000">RedisConnectionFactory</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">data</span>.<span style="color:#000000">redis</span>.<span style="color:#000000">core</span>.<span style="color:#000000">RedisTemplate</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">data</span>.<span style="color:#000000">redis</span>.<span style="color:#000000">serializer</span>.<span style="color:#000000">StringRedisSerializer</span>;
<span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* Redis配置类</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Configuration</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">RedisConfig</span> <span style="color:#770088">extends</span> <span style="color:#000000">CachingConfigurerSupport</span> {
<span style="color:#555555">@Bean</span>
<span style="color:#770088">public</span> <span style="color:#000000">RedisTemplate</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span>, <span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">redisTemplate</span>(<span style="color:#000000">RedisConnectionFactory</span> <span style="color:#000000">connectionFactory</span>) {
<span style="color:#000000">RedisTemplate</span><span style="color:#981a1a"><</span><span style="color:#008855">Object</span>, <span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#000000">redisTemplate</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">RedisTemplate</span><span style="color:#981a1a"><></span>();
<span style="color:#aa5500">//默认的Key序列化器为:JdkSerializationRedisSerializer</span>
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">setKeySerializer</span>(<span style="color:#770088">new</span> <span style="color:#000000">StringRedisSerializer</span>());
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">setHashKeySerializer</span>(<span style="color:#770088">new</span> <span style="color:#000000">StringRedisSerializer</span>());
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">setConnectionFactory</span>(<span style="color:#000000">connectionFactory</span>);
<span style="color:#770088">return</span> <span style="color:#000000">redisTemplate</span>;
}
}</span></span>
解释说明:
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别
第五步:提供测试类
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">itheima</span>.<span style="color:#000000">test</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">junit</span>.<span style="color:#000000">runner</span>.<span style="color:#000000">RunWith</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">beans</span>.<span style="color:#000000">factory</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Autowired</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">test</span>.<span style="color:#000000">context</span>.<span style="color:#000000">SpringBootTest</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">test</span>.<span style="color:#000000">context</span>.<span style="color:#000000">junit4</span>.<span style="color:#000000">SpringRunner</span>;
<span style="color:#555555">@SpringBootTest</span>
<span style="color:#555555">@RunWith</span>(<span style="color:#000000">SpringRunner</span>.<span style="color:#770088">class</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">SpringDataRedisTest</span> {
<span style="color:#555555">@Autowired</span>
<span style="color:#770088">private</span> <span style="color:#000000">RedisTemplate</span> <span style="color:#000000">redisTemplate</span>;
}</span></span>
5.3.2.2 操作字符串类型数据
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 操作String类型数据</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testString</span>(){
<span style="color:#aa5500">//存值</span>
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">set</span>(<span style="color:#aa1111">"city123"</span>,<span style="color:#aa1111">"beijing"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#008855">String</span> <span style="color:#000000">value</span> <span style="color:#981a1a">=</span> (<span style="color:#008855">String</span>) <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">get</span>(<span style="color:#aa1111">"city123"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">value</span>);
<span style="color:#aa5500">//存值,同时设置过期时间</span>
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">set</span>(<span style="color:#aa1111">"key1"</span>,<span style="color:#aa1111">"value1"</span>,<span style="color:#116644">10l</span>, <span style="color:#000000">TimeUnit</span>.<span style="color:#000000">SECONDS</span>);
<span style="color:#aa5500">//存值,如果存在则不执行任何操作</span>
<span style="color:#008855">Boolean</span> <span style="color:#000000">aBoolean</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForValue</span>().<span style="color:#000000">setIfAbsent</span>(<span style="color:#aa1111">"city1234"</span>, <span style="color:#aa1111">"nanjing"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">aBoolean</span>);
}</span></span>
5.3.2.3 操作哈希类型数据
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 操作Hash类型数据</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testHash</span>(){
<span style="color:#000000">HashOperations</span> <span style="color:#000000">hashOperations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForHash</span>();
<span style="color:#aa5500">//存值</span>
<span style="color:#000000">hashOperations</span>.<span style="color:#000000">put</span>(<span style="color:#aa1111">"002"</span>,<span style="color:#aa1111">"name"</span>,<span style="color:#aa1111">"xiaoming"</span>);
<span style="color:#000000">hashOperations</span>.<span style="color:#000000">put</span>(<span style="color:#aa1111">"002"</span>,<span style="color:#aa1111">"age"</span>,<span style="color:#aa1111">"20"</span>);
<span style="color:#000000">hashOperations</span>.<span style="color:#000000">put</span>(<span style="color:#aa1111">"002"</span>,<span style="color:#aa1111">"address"</span>,<span style="color:#aa1111">"bj"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#008855">String</span> <span style="color:#000000">age</span> <span style="color:#981a1a">=</span> (<span style="color:#008855">String</span>) <span style="color:#000000">hashOperations</span>.<span style="color:#000000">get</span>(<span style="color:#aa1111">"002"</span>, <span style="color:#aa1111">"age"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">age</span>);
<span style="color:#aa5500">//获得hash结构中的所有字段</span>
<span style="color:#000000">Set</span> <span style="color:#000000">keys</span> <span style="color:#981a1a">=</span> <span style="color:#000000">hashOperations</span>.<span style="color:#000000">keys</span>(<span style="color:#aa1111">"002"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">Object</span> <span style="color:#000000">key</span> : <span style="color:#000000">keys</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">key</span>);
}
<span style="color:#aa5500">//获得hash结构中的所有值</span>
<span style="color:#000000">List</span> <span style="color:#000000">values</span> <span style="color:#981a1a">=</span> <span style="color:#000000">hashOperations</span>.<span style="color:#000000">values</span>(<span style="color:#aa1111">"002"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">Object</span> <span style="color:#000000">value</span> : <span style="color:#000000">values</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">value</span>);
}
}</span></span>
5.3.2.4 操作列表类型数据
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 操作List类型的数据</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testList</span>(){
<span style="color:#000000">ListOperations</span> <span style="color:#000000">listOperations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForList</span>();
<span style="color:#aa5500">//存值</span>
<span style="color:#000000">listOperations</span>.<span style="color:#000000">leftPush</span>(<span style="color:#aa1111">"mylist"</span>,<span style="color:#aa1111">"a"</span>);
<span style="color:#000000">listOperations</span>.<span style="color:#000000">leftPushAll</span>(<span style="color:#aa1111">"mylist"</span>,<span style="color:#aa1111">"b"</span>,<span style="color:#aa1111">"c"</span>,<span style="color:#aa1111">"d"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">mylist</span> <span style="color:#981a1a">=</span> <span style="color:#000000">listOperations</span>.<span style="color:#000000">range</span>(<span style="color:#aa1111">"mylist"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">value</span> : <span style="color:#000000">mylist</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">value</span>);
}
<span style="color:#aa5500">//获得列表长度 llen</span>
<span style="color:#008855">Long</span> <span style="color:#000000">size</span> <span style="color:#981a1a">=</span> <span style="color:#000000">listOperations</span>.<span style="color:#000000">size</span>(<span style="color:#aa1111">"mylist"</span>);
<span style="color:#008855">int</span> <span style="color:#000000">lSize</span> <span style="color:#981a1a">=</span> <span style="color:#000000">size</span>.<span style="color:#000000">intValue</span>();
<span style="color:#770088">for</span> (<span style="color:#008855">int</span> <span style="color:#000000">i</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>; <span style="color:#000000">i</span> <span style="color:#981a1a"><</span> <span style="color:#000000">lSize</span>; <span style="color:#000000">i</span><span style="color:#981a1a">++</span>) {
<span style="color:#aa5500">//出队列</span>
<span style="color:#008855">String</span> <span style="color:#000000">element</span> <span style="color:#981a1a">=</span> (<span style="color:#008855">String</span>) <span style="color:#000000">listOperations</span>.<span style="color:#000000">rightPop</span>(<span style="color:#aa1111">"mylist"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">element</span>);
}
}</span></span>
5.3.2.5 操作集合类型数据
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 操作Set类型的数据</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testSet</span>(){
<span style="color:#000000">SetOperations</span> <span style="color:#000000">setOperations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForSet</span>();
<span style="color:#aa5500">//存值</span>
<span style="color:#000000">setOperations</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"myset"</span>,<span style="color:#aa1111">"a"</span>,<span style="color:#aa1111">"b"</span>,<span style="color:#aa1111">"c"</span>,<span style="color:#aa1111">"a"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">myset</span> <span style="color:#981a1a">=</span> <span style="color:#000000">setOperations</span>.<span style="color:#000000">members</span>(<span style="color:#aa1111">"myset"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">o</span> : <span style="color:#000000">myset</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">o</span>);
}
<span style="color:#aa5500">//删除成员</span>
<span style="color:#000000">setOperations</span>.<span style="color:#000000">remove</span>(<span style="color:#aa1111">"myset"</span>,<span style="color:#aa1111">"a"</span>,<span style="color:#aa1111">"b"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">myset</span> <span style="color:#981a1a">=</span> <span style="color:#000000">setOperations</span>.<span style="color:#000000">members</span>(<span style="color:#aa1111">"myset"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">o</span> : <span style="color:#000000">myset</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">o</span>);
}
}</span></span>
5.3.2.6 操作有序集合类型数据
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 操作ZSet类型的数据</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testZset</span>(){
<span style="color:#000000">ZSetOperations</span> <span style="color:#000000">zSetOperations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">opsForZSet</span>();
<span style="color:#aa5500">//存值</span>
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"a"</span>,<span style="color:#116644">10.0</span>);
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"b"</span>,<span style="color:#116644">11.0</span>);
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"c"</span>,<span style="color:#116644">12.0</span>);
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">add</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"a"</span>,<span style="color:#116644">13.0</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">myZset</span> <span style="color:#981a1a">=</span> <span style="color:#000000">zSetOperations</span>.<span style="color:#000000">range</span>(<span style="color:#aa1111">"myZset"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">s</span> : <span style="color:#000000">myZset</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">s</span>);
}
<span style="color:#aa5500">//修改分数</span>
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">incrementScore</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"b"</span>,<span style="color:#116644">20.0</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">myZset</span> <span style="color:#981a1a">=</span> <span style="color:#000000">zSetOperations</span>.<span style="color:#000000">range</span>(<span style="color:#aa1111">"myZset"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">s</span> : <span style="color:#000000">myZset</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">s</span>);
}
<span style="color:#aa5500">//删除成员</span>
<span style="color:#000000">zSetOperations</span>.<span style="color:#000000">remove</span>(<span style="color:#aa1111">"myZset"</span>,<span style="color:#aa1111">"a"</span>,<span style="color:#aa1111">"b"</span>);
<span style="color:#aa5500">//取值</span>
<span style="color:#000000">myZset</span> <span style="color:#981a1a">=</span> <span style="color:#000000">zSetOperations</span>.<span style="color:#000000">range</span>(<span style="color:#aa1111">"myZset"</span>, <span style="color:#116644">0</span>, <span style="color:#981a1a">-</span><span style="color:#116644">1</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">s</span> : <span style="color:#000000">myZset</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">s</span>);
}
}</span></span>
5.3.2.7 通用操作
<span style="background-color:#dadada"><span style="color:#1f0909"><span style="color:#aa5500">/**</span>
<span style="color:#aa5500">* 通用操作,针对不同的数据类型都可以操作</span>
<span style="color:#aa5500">*/</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testCommon</span>(){
<span style="color:#aa5500">//获取Redis中所有的key</span>
<span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">keys</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">keys</span>(<span style="color:#aa1111">"*"</span>);
<span style="color:#770088">for</span> (<span style="color:#008855">String</span> <span style="color:#000000">key</span> : <span style="color:#000000">keys</span>) {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">key</span>);
}
<span style="color:#aa5500">//判断某个key是否存在</span>
<span style="color:#008855">Boolean</span> <span style="color:#000000">itcast</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">hasKey</span>(<span style="color:#aa1111">"itcast"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">itcast</span>);
<span style="color:#aa5500">//删除指定key</span>
<span style="color:#000000">redisTemplate</span>.<span style="color:#000000">delete</span>(<span style="color:#aa1111">"myZset"</span>);
<span style="color:#aa5500">//获取指定key对应的value的数据类型</span>
<span style="color:#000000">DataType</span> <span style="color:#000000">dataType</span> <span style="color:#981a1a">=</span> <span style="color:#000000">redisTemplate</span>.<span style="color:#000000">type</span>(<span style="color:#aa1111">"myset"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">dataType</span>.<span style="color:#000000">name</span>());
}</span></span>
redis
linux开启redis并输入密码
windows连接本机Redis redis-cli.exe -h 127.0.0.1 -a 123456
src/redis-cli -h localhost -p 6379 -a 123456
开启服务
src/redis-server ./redis.conf
windows链接linux端redis
.\redis-cli.exe -h 192.168.23.100 -p 6379 -a 123456
redis常用命令
字符串String操作命令
set key value 设置指定key的值
get key 获取指定key的值
setex key seconds value设置指定的key值,并将key的过期时间设为seconds 秒
setnx key value 只有在key不存在时设置key的值\
哈希hash操作命令
HSET key field value 将哈希表 key 中的字段 field 的值设为 value
HGET key field 获取存储在哈希表中指定字段的值
HDEL key field 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
HGETALL key 获取在哈希表中指定 key 的所有字段和值
列表list操作命令
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时 或发现可弹出元素为止
集合set操作命令
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 [key2] 返回给定所有集合的交集
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SREM key member1 [member2] 移除集合中一个或多个成员
有序集合 sorted set 操作命令
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员
通用命令
KEYS pattern 查找所有符合给定模式( pattern)的 key
EXISTS key 检查给定 key 是否存在
TYPE key 返回 key 所储存的值的类型
TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
DEL key 该命令用于在 key 存在是删除 key