进阶架构
2021-07-07 20:30:47 0 举报
AI智能生成
微服务阶段知识整理
作者其他创作
大纲/内容
Linus
概述
Linux是基于Unix的开源、免费、多用户、多任务的操作系统,由于系统的稳定性和安全性。几乎成为程序代码运行的最佳系统环境
优势
Linux系统是免费,很多还是开源的
长时间运行,很稳定的
几乎没有病毒和流氓软件
入门
目录结构
/
根目录
root
管理员所在目录
home
普通用户的主目录
bin
所有的命令可执行文件所在目录
etc
系统配置文件所在的目录
usr
Unix Share Resource,资源目录,很多软件就安装在这个目录下
目录操作命令
cd [OPTION] [DIR]
切换当前路径
.
当前目录
..
上一级目录
~
用户主目录
-
上一次的目录
操作演示
切换到系统根目录
cd /
切换到该目录下usr目录
cd usr
切换到上一层目录
cd ..
切换到用户主目录,如果是root管理员,则是到root目录
cd /root或cd ~
切换到上一个所在的目录
cd -
mkdir [OPTION] DIRECTORY
创建目录
操作演示
进入root目录
cd /root
在root目录下创建aaa目录
mkdir aaa
使用.方式的相对路径,在当前目录下创建bbb目录
mkdir ./bbb
在root目录下,在bbb目录下创建ccc目录
mkdir bbb/ccc
使用..在上一级目录下创建eee目录
mkdir ../eee
使用绝对路径在root下创建目录fff目录
mkdir /root/fff
ls [OPTION] [FILE]
显示目录内容
-l
以详细的方式显示文件和目录。ls -l可以缩写成ll
-a
显示所有的文件和目录包含隐藏的文件和目录
隐藏的文件和目录以 . 开头
隐藏的文件和目录以 . 开头
操作演示
进入root目录,以精简形式查询当前目录下的内容
cd ~
ls
ls
以详细形式查询当前目录下的内容,可以缩写成ll
ls -l或ll
在当前目录下创建一个隐藏的目录.ccc
mkdir .ccc
以精简形式查询当前目录下的所有的内容,包含隐藏文件
ls -a
以详细形式查询当前目录下的隐藏内容,-la和-al都可,也可以使用ll -a
ls -al或ls -la或ll -a
find [PATH] [-name pattern]
搜索目录树上的所有文件
-name pattern
指定要查询的字符串
* 匹配多个字符
? 匹配1个字符
-exec utility [argument ...] ;
-exec utility [argument ...] {} +
操作演示
在/root目录下,查询当前目录下所有的文件和目录
cd /root
find -name "*"
find -name "*"
查询/根目录下(包括子目录),名以abc开头的目录和文件
cd /
find -name "abc*"
find -name "abc*"
查询根目录即其子目录下以cc开头的三个字符的目录或文件
cd /
find -name "cc?"
find -name "cc?"
mv [OPTION] SOURCE DEST
移动、重命名文件或目录
操作演示
将root文件夹下的aaa目录改成abc
cd ~
mv aaa abc
mv aaa abc
使用touch创建一个空文件为aaa,再使用mv将aaa文件改名为xyz
touch aaa
mv aaa xyz
mv aaa xyz
将root下的xyz,移动到系统根目录下
mv xyz /
cp [OPTION] SOURCE DEST
复制文件或目录
-r
递归复制目录,连同子目录一起复制
操作演示
当前是root目录,复制/proc/dma文件到root目录下的bbb目录中
cp /proc/dma ./bb
将/etc目录下所有c开头的文件复制到root目录下的bbb目录下
cp -r /etc/c* /root/bbb
将/etc目录下所有h开头的文件和目录复制到root目录下的eee目录,连同子目录下的内容一起复制
cp -r /etc/h* /root/eee
rm [OPTION] FILE
移除文件或目录
-r
递归地移除目录中的内容
-f
忽略不存在的文件,并且从不向用户提示
操作演示
同时删除eee目录下的hostname和hosts文件
rm /root/eee/hostname*
rm /root/eee/hosts
rm /root/eee/hosts
进入root下的bbb目录,删除所有文件名csh,任意扩展名的文件
rm csh.*
进入root目录下的eee目录,递归删除httpd目录和所有子目录的文件,不进行确认,强制删除
cd ~/eee
rm -rf httpd
rm -rf httpd
man
在线参考手册
文件操作命令
cat [OPTION] [FILE]
显示文件内容
more [OPTION] FILE
分页显示文件
[Enter] 逐行显示
[Space] 逐页显示
[Q] 退出
head [OPTION] [FILE]
输出文件的开始部分
-n
显示指定的前n行,默认10行
tail [OPTION] [FILE]
输出文件的末尾部分
-n
显示指定的后n行,默认10行
less [OPTION] [FILE]【常用】
分页或翻页显示文件内容
-N
显示行号
[Ctrl + U]向上翻一页
[PageUp]向上翻一页
[Ctrl + D]向下翻一页
[PageDn]向下翻一页
[Q] 退出
touch [OPTION] FILE
创建一个文本文件,长度是0个字节
操作演示
将素材目录的Demo.java文件,上传到root目录下。
查看当前目录下Demo.java文件的全部内容
cat Demo.java
分页查看当前目录下Demo.java文件内容,按回车键一行一行的看,按空格健一页一页的看
more Demo.java
查看当前目录下Demo.java文件的前10行内容
head Demo.java
查看当前目录下Demo.java文件的后10行内容
tail Demo.java
查看当前目录下Demo.java文件的前5行内容
head -n 5 Demo.java
查看当前目录下Demo.java文件的后5行内容
tail -n 5 Demo.java
使用less命令显示Demo.java文件,显示行号
less -N Demo.java
vim文本编辑器
三种模式
命令模式
可以移动光标、删除字符等操作,打开文件时即进入这个模式
编辑模式
在此模式下可以输入字符,进行编辑等操作
底行模式
可以输入命令对编辑的文件进行查找,保存,退出等操作
三种模式切换
进入命令模式
vi filename
退出命令模式
wq
命令模式进入编辑模式
输入i a o其中一个
编辑模式进入命令模式
ESC键
命令模式进入底行模式
:
底行模式进入命令模式
命令以回车结束运行
vim命令
i
在光标的前面插入字符
a
在光标的后面插入字符
o
在光标的下一行插入字符
yy
复制当前行
p
如果之前已经复制了这个就可以粘贴
dd
删除当前行
u
撤销前面的操作undo
/字符串
在内容中搜索指定的字符串 n:向后继续查找 N:向前继续查找
wq
保存并退出
q!
强制退出,不保存
wq!
强制保存退出,用于只读文件
操作演示
vim Hello.java 用vim编辑器创建/打开Hello.java文件,这时进入命令模式。
按i键,进入编辑模式,输入以下内容
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
public static void main(String[] args) {
System.out.println("Hello!");
}
}
按Esc键,进入命令模式,按冒号进入底行模式
输入:wq回车,表示存盘退出
使用cat Hello.java查看文件的内容
使用vim打开Hello.java文件,进入命令模式
将光标移动到System.out这一行,按yy复制
按3次p,粘贴这一行三次
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
}
}
public static void main(String[] args) {
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
}
}
按dd删除最后一行
按i进入编辑模式
再任意输入一些内容
在按Esc进入命令,按冒号进入底行模式
输入q!回车,不存盘强行退出
使用cat Hello.java发现Hello.java没有变化
压缩与解压命令
扩展名
.zip或.rar
在windows下两种压缩文件格式
.tar
在Linux下打包文件,不一定压缩
.gz
在Linux下压缩文件
.tar.gz
既打包又压缩
常用命令
tar
操作压缩文件
-z
--gzip, --ungzip, 用 gzip 对存档压缩或解压
-x
--extract, --get, 从存档展开文件,解压【重点】
-c
--create, 压缩文件【重点】
-v
--verbose, 详细显示处理的文件
-f
--file [HOSTNAME:], 指定存档
-C
--directory DIR, 转到指定的目录
操作演示
定位于root目录,将当前目录下的Hello.java和Demo.java文件打包成hello.tar文件,并显示详细信息
tar -cvf hello.tar Hello.java Hello.txt
将当前目录下的Demo.* 打包并压缩成demo.tar.gz文件,显示详细信息
tar -zcvf demo.tar.gz Demo.*
定位于root目录下,删除所有大写的Hello开头的文件
rm -rf Hello*
解压hello.tar到当前目录
tar -xvf hello.tar
释放demo.tar.gz文件到abc目录下
tar -xvf demo.tar.gz -C abc
其他命令
pwd【重点】
显示当前工作目录
ps【相对重点】
查看进程状态
-a
显示所有用户在终端上启动的进程
-u
显示所有用户在终端启动的进程的详细信息
-x
显示所有用户启动的所有进程
Linus进程
操作系统启动的时候自动启动的进程
由用户在终端上(命令行中)输入的进程
Bash进程
每个用户登录以后都会分配一个终端操作的进程
这个进程是所有终端命令的父进程,不要随意终止这个进程
操作演示
在客户端中显示当前用户通过终端启动的所有进程
ps
在Linux命令行窗口运行vim Hello.txt编辑文件,显示所有用户通过终端启动的所有进程
ps -a
显示所有用户通过终端启动的所有进程详细信息
ps -au
显示所有用户所有进程详细信息
ps -aux
kill [-9] signal【相对重点】
终止进程
-9
强行终止
grep [OPTIONS] PATTERN [FILE...]【重点】
打印匹配给定模式的行
-n
在输出的每行前面加上它所在的文件中它的行号
-v
选择不匹配的行
-i
忽略大小写
操作演示
在Demo.java中搜索close字符串
grep close Demo.java
在Demo.java中搜索close字符串,并且显示行号
grep close Demo.java -n
在Demo.java中搜索没有close的行和行号
grep close Demo.java -nv
在Demo.java中忽略大小写搜索insert字符串并且显示行号
grep insert Demo.java -ni
xargs [-options] [command]
将标准输入转为命令行参数
-d
更改分隔符
-p
打印出要执行的命令,询问用户是否要执行
-t
打印出要执行的命令,直接执行
管道命令/重定向命令
|【重点】
语法
命令1 | 命令2
解释
将一个命令(命令1)的执行结果做为另一个命令(命令2)的条件输入
操作演示
分屏显示/etc目录所有文件的详细信息,将ll的输出做为more的输入,即分屏显示
ll /etc | more
在root目录下使用ll显示所有文件的详细信息,再在显示结果中使用grep查询Demo字符串
ll /root | grep Demo
显示Linux中所有进程的详细信息,查询ssh的字符串
ps -ax | grep ssh
>【了解】
语法
命令 > 文件
解释
将输出重定向到文件中(替换/覆盖)
>>【了解】
语法
命令 >> 文件
解释
将输出重定向到文件中(追加)
poweroff【重点】
同shutdown now
reboot【重点】
重启系统
其他
&&【了解】
逻辑控制命令
obj.condition() && obj.condition2()
只有在&&左边的命令成功时,&&右边的命令才会被执行。只要左边命令运行失败,后面的命令就不会被执行
shutdown【了解 】
停止、关闭或重启机器
参数
-now
立即关机
权限操作
Linux中对每个目录和文件都做了规定,只能由满足条件的用户才能操作这个目录或文件,这个规定叫权限
用户和组
属主
目录或文件的所有者
属组
所有者所在的组
其他用户
其他用户和组
权限位
r 4 Read读取
w 2 Write写入
x 1 execute执行
- 0 没有权限
权限范围
u
User属主
g
Group 属组
o
Other 其他用户
a
All 上面所有的用户
权限操作
符号
+
添加权限
=
修改权限
-
删除权限
chmod MODE FILE
改变Demo.java的权限,给属主添加可执行权限
chmod u+x Demo.java
改变Demo.java的权限,给属组添加可读可运行权限
chmod g+rx Demo.java
Demo.java的所有用户都添加可读可写可运行(所有权限)
chmod a+rwx Demo.java
属主添加可执行,其它用户添加可写权限
chmod u+x, o+w Demo.html
属主修改为可读可写可运行,属组可写权限,其他用户可执行
chmod u=rwx,g=w,o=x Demo.java
为所有用户修改为可读可写、可运行权限
chmod a=rwx Demo.java
所有用户不可读不可写不可运行权限
chmod a-rwx Demo.java
属主删掉写,组删掉写权限
chmod u-w,g-w Demo.java
chown [options] user [:group] file...
修改文件所有者和组别
-R
递归修改目录及其下面内容的所有权
示例
将当前目录,及子目录中的所有文件,把所有者,改为root用户
chown -R root:root .
任务调度命令【了解】
crontab [OPTION]
定时执行指定
参数
-l
显示当有已经设置好的定时执行的任务
-e
使用vim编辑任务
-r
删除定时任务
定时任务的配置
一行写一个任务,每个任务有6个列,前面5列是时间,最后1列是要执行的命令
格式
minute
表示分钟,可以是从0到59之间的任何整数
hour
表示小时,可以是从0到23之间的任何整数
day
表示日期,可以是从1到31之间的任何整数
month
表示月份,可以是从1到12之间的任何整数
week
表示星期几,可以是从0到7之间的任何整数,0或7代表星期日,1-6表示星期一到六
command
要执行的命令
特殊字符
*
代表所有可能的值。
如:*,用在月上,表示每月执行;用在分上,表示每分执行
,
用逗号隔开的值指定某几个时间点。
如:1,2,5,用在小时上,表示1点,2点,5点
-
表示一个整数范围。
如:2-6,用在日上,表示2号到6号
/
指定时间的间隔频率。
如: 0-10/2,用在小时上,表示0点到10点中每两小时执行一次。 与星号一起使用。
如: /10,用在分钟字段,表示每10分钟执行一次
>>
指定输出的文件
如: * * * * * date >> /root/mydate.log
练习
每分钟执行
* * * * * command
每天21:30执行命令
30 21 * * * command
每个小时的3分的时候,和15分的时候,执行
3,15 * * * * command
8:05,8:10, 9:05, 9:10 … 分别执行
5,10 8-11 * * * command
每偶数分钟时,执行command
*/2 * * * * command
深入
主机名配置【了解】
hostname
显示或临时设置系统的主机名
hostname [HOSTNAME]
临时设置主机名为HOSTNAME。如果hostname没有任何参数,显示主机名
hostnamectl set-hostname
永久设置系统的主机名
hostnamectl set-hostname [HOSTNAME]
永久设置主机名为HOSTNAME
操作演示
查看当前的主机名
hostname
设置新的主机名为future-weaver,再查看当前的主机名
hostname future-weaver
设置新的主机名为future-weaver,重启以后仍然有效
hostnamectl set-hostname future-weaver
服务管理【掌握】
systemctl status mysqld
查看服务状态
systemctl start mysqld
启动服务
systemctl stop mysqld
关闭服务
systemctl restart mysqld
重新启动-先关闭,再启动
systemctl enable mysqld
开机启动
systemctl disable mysqld
取消开机启动
网络管理
netstat【了解】
显示网络连接,路由表
-n
显示进程的IP地址和端口号
-t
只显示使用TCP协议进程
-l
只显示正在网络监听的进程(默认选项)
-p
显示程序的名字和进程的ID
-r
显示路由表【重点】
操作演示
显示TCP协议的网络连接
netstat -t
显示TCP协议和监听中的网络连接
netstat -tl
显示TCP协议和监听中的网络连接,显示IP地址和端口号
netstat -tln
显示TCP协议和监听中的网络连接,显示IP地址和端口号,显示程序的名字
netstat -tlnp
显示路由表【重点】
netstat -r
查看端口号占用情况
netstat -naop | grep 端口号
curl【了解】
curl [options...] <url>
-d
指定请求体
-H
指定请求头
-X
指定请求方式
wget【了解】
wget [options...] <url>
下载文件
网卡配置
dhcp
动态获取ip
static
配置静态ip
关闭网卡
修改/etc/sysconfig/network-scripts/ifcfg-enp0s3,ONBOOT参数设置为"no"
运行命令systemctl restart network
运行命令ping www.future-weaver.com,查看外网能否连接
按原步骤,激活网卡
配置静态ip地址
修改/etc/sysconfig/network-scripts/ifcfg-enp0s8
#将BOOTPROTO=dhcp修改为BOOTPROTO=static
添加IPADDR=192.168.56.102
重启网络
systemctl restart network
按原步骤,配置动态ip
克隆虚拟机
关闭虚拟机
在VirtualBox操作界面,右键虚拟机,复制
设置新虚拟电脑名称
副本类型选择完全复制
备份选择当前虚拟电脑状态
Mac地址设置选择为所有重新生成MAC地址
复制
运行新虚拟机,运行nmtui命令,重新设置网卡
SSH免密登录
为什么要登录
在企业中,多台Linux机器是可以相互之间进行登录和退出的。用Linux自带的SSH客户端命令,可以通过输入用户名和密码的方式登录到另一台Linux机器中
非对称加密【了解】
密钥成对出现(公钥、私钥)
使用公钥加密,就使用私钥解密
使用私钥加密,就使用公钥解密
SSH
Secure Shell 协议,安全壳协议。用于Linux之间加密登录一种协议
SSH两种验证机制
直接输入用户名和密码的方式
ssh username@ip
免密登录,直接登录,不需要输入用户名和密码
如果网络中Linux服务器比较多,需要记住每台服务器的密码也是比较痛苦的事。你无需知道另一台机器上的帐号和口令,也可以登录到远程主机。我们说的SSH免密登录,就说的是这种方式
ssh-keygen
生成公钥和私钥,生成的公钥和私钥在/root/.ssh目录下。id_rsa是私钥,id_rsa.pub是公钥
ssh-copy-id
ssh-copy-id root@192.168.56.102
将新生成的密钥(公钥)发送到指定服务器。在服务器的/root/.ssh/autorized_keys文件中
ssh root@192.168.56.102
不需要输入密码了
用户管理命令【了解】
useradd [OPTION] LOGIN
创建一个新用户或更新默认新用户信息,创建好的用户信息在/etc/passwd文件中
参数
LOGIN
指定创建的用户名
-m
创建用户的同时,在/home下创建用户的主目录[默认参数]
-g
创建用户的同时,指定用户所在的组
未指定组名:默认就在一个与用户同名的组中。组名与用户名相同
操作演示
进入/home目录,查看目录的内容
cd /home
ll
创建用户Jack,并且创建用户主目录
useradd Jack
再次ll查看/home目录下存在Jack目录,默认用户Jack在一个叫Jack的组中
ll
创建用户Tom,把用户放在Jack这个组中,并且创建Tom主目录
useradd Tom -g Jack
通过ll查看/home目录下的信息
ll
查看/etc/passwd文件,可以看到创建的用户信息
more /etc/passwd
passwd [OPTION] [username]
更新用户密码
参数
username 只有管理员才可以给指定的用户设置密码,默认为当前用户
操作演示
设置Jack的密码为abc123。如果提示无效的密码,忽略即可,再次输入同一个密码,修改成功
passwd Jack
whoami
查看自己的用户名
su [OPTION] [username]
切换用户
参数
username 指定要切换的用户名,默认为root
userdel [OPTION] LOGIN
删除用户账户和相关文件
参数
LOGIN
指定删除的用户名
-r
除用户的同时,也删除它的主目录
usermod [OPTION] LOGIN
修改用户帐户
参数
LOGIN
指定修改前的原用户名
-l
NEW_LOGIN 指定修改后的新用户名
用户组管理命令【了解】
groupadd [OPTION] GROUP
创建一个新组。在/etc/group文件中,包含了所有创建组的信息
usermod [OPTION] LOGIN
修改用户帐户。一个用户只能有一个主组,可以有多个从组
参数
-g
修改用户的主组
-G
修改用户的从组(附属组),可以有多个从组
gpasswd [OPTION] GROUP
将用户从附属组(从组)中删除
参数
GROUP
指定要删除的组名
-d
将用户从附属组(从组)中删除
groupmod [OPTION] GROUP
修改组的名字
-n
将组名改成新的组名
groupdel [OPTION] GROUP
删除一个组
GROUP
删除指定的组
软件安装命令【重点】
rpm [OPTION]
对linux中已经安装的软件进行管理
参数
-v
提供更多的详细信息输出
-q 软件名
查询当前系统是否安装了指定的软件
-a
查询所有已经安装的软件
-h
在安装的过程中显示进度条 # 50%
-i, --install 软件名
安装指定的软件
操作演示
查看所有安装的软件
rpm -qa
查看gcc-c++这个软件包是否安装
rpm -q gcc-c++
安装指定的软件
rpm -ivh 软件名
yum [OPTION] [command] [package ...]
从指定的服务器自动下载包并且安装,可以自动处理依赖关系,一次安装所有依赖的软件包
参数
-y
所有的提问都回答yes
命令
install, 安装软件
remove, 卸载软件
操作演示
安装gcc-c++ 这个安装包,安装的提示全部回答yes
yum –y install gcc-c++
Linux服务器搭建
JDK安装
进入“/root”目录,解压jdk到指定目录/usr/local下
tar -xvf jdk-8u291-linux-x64.tar.gz -C /usr/local/
配置jdk环境变量,打开/etc/profile配置文件,将下面配置拷贝进去。export命令用于将shell变量输出为环境变量
/etc/profile
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_291
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
重新加载/etc/profile配置文件,并测试
source /etc/profile
判断JDK是否安装成功
java -version
javac -version
编写Hello World
Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!!!");
}
}
编译成字节码文件
javac Hello.java
执行Java程序
java Hello
MySql安装
MySQL在线下载安装
注:需要连接互联网,在线mysql的安装包,5.6的版本大约86M
查看CentOS是否自带的MySQL,如果已经安装需要卸载。如果没有找到,则表示没有安装
rpm -qa | grep mysql
在线获取CentOS7的mysql的rpm安装文件,直接执行如下命令
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
执行安装命令
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
得到两个配置文件,在/etc/yum.repos.d目录下
mysql-community.repo用于指定下载哪个版本的安装包
mysql-community-source.repo用于指定下载哪个版本的源码
修改MySQL的下载配置文件
vim /etc/yum.repos.d/mysql-community.repo
在当前目录/etc/yum.repos.d下执行下面的命令,开始在线下载:客户端,服务器端,开发的工具包
yum -y install mysql-community-client mysql-community-server mysql-community-devel
使用rpm命令,可以查询到mysql已经安装好的包
rpm -qa | grep mysql
启动MySQL服务并登录
启动mysql的服务
# Linux命令
systemctl start mysqld
将mysql加到系统服务中并设置开机启动
# Linux命令
systemctl enable mysqld
登录mysql,root用户默认没有密码
# Linux命令
# 查看随机密码
grep 'temporary password' /var/log/mysqld.log
# 使用随机密码登录
mysql -u root -p
在mysql中修改自己的密码
# MySQL命令
set password = password('新密码');
设置远程访问权限
开启mysql的远程登录权限,默认情况下mysql为安全起见,不支持远程登录mysql,所以需要设置开启,并且刷新权限缓存
远程登录mysql的权限登录mysql后输入如下命令
# MySQL命令
grant all privileges on *.* to 'root'@'%' identified by '远程密码';
flush privileges;
开放Linux的对外访问的端口3306
# Linux命令
#开放3306端口
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
#开放的端口永久保存到防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重启防火墙
systemctl restart firewalld
Redis安装
依赖工具安装
yum -y install gcc tcl
Redis安装
将redis-5.0.5.tar.gz拷贝到Linux的root目录下
解压并进入目录
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
安装Redis
make && make install
前端模式启动
前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法
redis-server
后端模式启动
复制配置文件至系统配置目录
mkdir /etc/redis
cp ~/redis-5.0.5/redis.conf /etc/redis
修改redis.conf配置文件, daemonize yes 开启后端模式
以配置文件启动redis
redis-server /etc/redis/redis.conf
Tomcat安装与项目发布
安装步骤
解压Tomcat到/usr/local下
tar -zxvf apache-tomcat-8.5.68.tar.gz -C /usr/local/
开放Linux的对外访问的端口8080
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重启防火墙
systemctl restart firewalld
进入bin目录,启动Tomcat
chmod +x *.sh
./startup.sh
在Windows下打开浏览器访问Linux的8080端口
进入bin目录下,关闭服务器。关闭服务器以后,浏览器不能再访问
./shutdown.sh
Git安装
Docker
概述
什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等
什么是Docker
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
容器与虚拟机比较
容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统
传统方式则是在硬件层面实现
与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小
Docker组件
network
container
image
data volumes
入门
安装
Linux版本安装
Desktop安装
仓库配置文件
Linux
vim /etc/docker/daemon.json
Docker Desktop
设置
Docker Engine
配置成以下文件
启动
启动docker服务
systemctl start docker
重新加载配置文件
systemctl daemon-reload
停止docker服务
systemctl stop docker
重启docker服务
systemctl restart docker
查看docker服务状态
systemctl status docker
设置docker服务开机自启动
systemctl enable docker
查看docker状态
docker info
查看docker帮助
docker --help
快速入门
拉取tomcat镜像
docker pull tomcat:8.5.68-jdk8
查看镜像是否已经拉取
docker images
通过镜像运行容器
docker run -id --name tomcat -p 8080:8080 tomcat:8.5.68-jdk8
打开浏览器,测试
http://宿主机ip:8080
常用命令
敲docker的任意一个命令,最后--help,就能够查看此命令的详细解释
镜像操作【重点】
pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
从远程仓库中,拉取一个镜像
search
docker search [OPTIONS] TERM
通过命令行方式,检索镜像
images
docker images [OPTIONS] [REPOSITORY[:TAG]]
列出在本地仓库中的所有镜像
rmi
docker rmi [OPTIONS] IMAGE [IMAGE...]
删除一个镜像
-f
强制删除
扩展:备份与恢复
save【了解】
docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive
load【了解】
docker load [OPTIONS]
Load an image from a tar archive or STDIN
tag【了解】
docker tag SOURCE_IMAGE[:TAG]
TARGET_IMAGE[:TAG]
TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
容器操作【重点】
run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
基于一个镜像启动一个容器
参数
-d
在后台运行容器(不占用用户进程)
-e
设置容器内部的环境变量
-i
使用标准输入
-p
端口映射,将容器中的某一个端口,映射到宿主机的一个端口
-v
绑定数据卷
--name string
指定容器的名称
--rm
当容器关闭时,自动删除
--network string
运行一个容器并连接到指定网络
练习
启动mysql容器
docker run -id --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v /Users/LEAF/mysql_data:/var/lib/mysql mysql:5.7.34
ps
docker ps [OPTIONS]
列出容器
参数
-a
列出所有容器,包括停止的
-q
只查看容器ID
logs
docker logs [OPTIONS] CONTAINER
查看容器的日志
参数
-f
实时监听日志,直到用户输入Ctrl - C
exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
进入容器
参数
-it
使用用户控制台
cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
将宿主机中的目录或文件,复制到容器中;或将容器中的目录或文件,复制到宿主机中
restart
docker restart [OPTIONS] CONTAINER [CONTAINER...]
重启
stop
docker stop [OPTIONS] CONTAINER [CONTAINER...]
停止
start
docker start [OPTIONS] CONTAINER [CONTAINER...]
启动
rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
删除
参数
-f
强制删除,可以删除正在运行中的容器
inspect
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
查看容器的详情
练习
运行mysql容器
docker run -id -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 -v "E:/Program Files/mysql_data":/var/lib/mysql --name mysql mysql:5.7.34
停止mysql容器
docker stop mysql
启动mysql容器
docker start mysql
重启mysql容器
docker restart mysql
停止mysql容器,查看正在运行中的容器
docker stop mysql
docker ps
docker ps
查看所有容器
docker ps -a
运行mysql容器,查看mysql容器的日志
docker start mysql
docker logs mysql
docker logs mysql
实时查看mysql容器的日志
docker logs -f mysql
进入mysql容器,查看容器中的/home目录的内容
docker exec -it mysql bash
将宿主机中的一个空目录复制到容器中
docker cp "C:/Program Files/newfolder" mysql:/home
将容器中的一个空文件复制到宿主机中
docker cp mysql:/home/newfile "C:/Program Files/"
数据卷操作
数据卷的核心,在于映射时,指定别名,而不是绝对路径
volume create
docker volume create [OPTIONS] [VOLUME]
创建数据卷
volume inspect
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
查看数据卷详情
volume ls
docker volume ls [OPTIONS]
列出所有的数据卷
参数
-q
只查看数据卷的名字
volume rm
docker volume rm [OPTIONS] VOLUME [VOLUME...]
删除数据卷,如果一个数据卷正在被容器使用,那么无法删除
参数
-f
强制删除
练习
创建mysql_data数据卷
docker volume create mysql_data
将mysql容器删除,重新生成一个mysql容器,用mysql_data数据卷别名启动
docker rm -f mysql
docker run -id -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 -v mysql_data:/var/lib/mysql --name mysql mysql:5.7.34
查看mysql_data数据卷详情
docker volume inspect mysql_data
删除mysql_data数据卷,会提示无法删除,因为正在使用当中
docker volume rm mysql_data
删除mysql容器,删除mysql_data数据卷
docker rm -f mysql
docker volume rm mysql_data
网络操作【重点】
network create
docker network create [OPTIONS] NETWORK
创建网络
参数
-d string
网络类型(默认为bridge类型)
network rm
docker network rm NETWORK [NETWORK...]
删除网络
network inspect
docker network inspect [OPTIONS] NETWORK [NETWORK...]
查看网络信息
参数
-v
详情模式
network ls
docker network ls [OPTIONS]
列出网络
参数
-q
只显示网络ID
network prune
docker network prune [OPTIONS]
删除所有没有正在使用的网络
练习
建立global网络,默认是bridge类型网络
docker network create global
查看所有网络,确认global已经被创建
docker network ls
运行tomcat1和tomcat2容器,全部使用global网络
docker run -id -p 8081:8080 --name tomcat1 --network global tomcat:8.5.68-jdk8
docker run -id -p 8082:8080 --name tomcat2 --network global tomcat:8.5.68-jdk8
进入tomcat1容器,curl测试tomcat2是否能够连接
docker exec -it tomcat1 bash
curl http://tomcat2:8080
Dockerfile
概念
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境; 2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植
指令
FROM image_name:tag
使用哪个基础镜像启动构建流程
MAINTAINER username
声明镜像的创建者
ENV key value
设置环境变量 (可以写多条)
ADD
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY
和ADD相似,但是如果有压缩文件并不能解压
WORKDIR
设置工作目录
RUN
是Dockerfile的核心部分(可以写多条)
EXPOSE
根据镜像启动容器后,将要占用哪些端口
CMD
根据镜像启动容器后,将要运行哪些命令
命令
bulid
docker build [OPTIONS] PATH | URL | -
根据dockerfile构建镜像
参数
-t list
指定镜像名称与版本号
快速入门
编写Dockerfile文件
根据Dockerfile构建镜像
docker build -t jdk:8 .
服务编排三剑客
Compose、Machine和Swarm是Docker原生提供的三大编排工具
Docker Compose【重点】
之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数。而且Docker-Compose可以帮助我们批量的管理容器。这些信息只需要通过一个docker-compose.yml文件去维护即可
安装
Linux版本安装
Docker Desktop版本安装
Docker Desktop 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用
快速入门
创建docker网络
docker network create global
新建目录,创建docker-compose.yml文件
启动容器
docker-compose up -d
停止并删除容器
docker-compose down
命令
docker-compose up
docker-compose up [SERVICE...]
Create and start containers 创建和开启容器
docker-compose down
docker-compose down
Stop and remove containers, networks 停止并删除容器,网络
docker-compose start
docker-compose start [SERVICE...]
Start services 开启服务
docker-compose stop
docker-compose stop [SERVICE...]
Stop services 停止服务
docker-compose restart
docker-compose restart
Restart containers 重启容器
docker-compose rm
docker-compose rm [SERVICE...]
Removes stopped service containers 删除已经停止的容器
docker-compose ps
docker-compose ps
List containers 显示容器列表
docker-compose logs
docker-compose logs [service...]
View output from containers 显示日志
Nexus部署
常见的Maven仓库管理软件
Apache Archiva
Artifactory
Sonatype Nexus
Nexus安装
Nexus登录
访问私服:http://宿主机ip:8081/
用户名: admin
进入容器查看admin密码
docker exec -it nexus3 bash
cat /nexus-data/admin.password
仓库类型【了解】
group
包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件
hosted
私服 服务器本地的仓库,其中存储诸多构件
proxy
代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载
仓库名称【了解】
maven-public
包含了central、releases、snapshots仓库
maven-central
代理仓库
maven-releases
存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库
maven-snapshots
对应不稳定的发布版本
Maven配置私服【重点】
Maven关联私服
配置settings.xml,设置私服地址、认证等信息
至此,Maven项目中需要依赖时,Maven会从私服中下载
Maven项目部署到私服
执行 :mvn deploy 即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
但需要提前在项目的pom.xml中配置部署私服仓库位置
注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证
Docker私有仓库部署
仓库搭建
docker-compose.yml
测试
http://docker宿主机ip:5000/v2/_catalog
仓库配置
参考《2.2 仓库配置》,添加如下选项,并重启docker
上传镜像至仓库
标记此镜像为私有仓库的镜像
docker tag jdk1.8 docker宿主机ip:5000/jdk1.8
再次启动私服容器
docker start registry
上传标记的镜像
docker push docker宿主机ip:5000/jdk1.8
Docker Machine【了解】
Docker Machine 是 Docker 官方编排(Orchestration)项目之一,负责在多种平台上快速安装 Docker 环境
安装
Linux版本安装
Docker Desktop版本安装
Docker Desktop 自带 docker-machine 二进制包,安装之后即可使用
命令
docker-machine create
docker-machine create [OPTIONS] [arg...]
创建一个 Docker 主机
docker-machine ssh
docker-machine ssh [arg...]
SSH 到主机上执行命令
docker-machine ls
docker-machine ls [OPTIONS] [arg...]
列出所有管理的主机
docker-machine start
docker-machine start [arg...]
启动一个主机
docker-machine stop
docker-machine stop [arg...]
停止一个主机
docker-machine restart
docker-machine restart [arg...]
重启主机
docker-machine rm
docker-machine rm [OPTIONS] [arg...]
删除某台主机
Docker Swarm【了解】
Docker Swarm 是 Docker 官方编排(Orchestration)项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。竞品为K8S
Nginx
概述
引言
Nginx是由俄罗斯人研发的,应对Rambler的网站,并且2004年发布的第一个版本
Nginx是一种http协议服务器软件,使用C和C++语言开发,让程序员可以将网页发布在Nginx服务器上,让成千上万的用户可以浏览。除此之外,Nginx还是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。国内使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定
代理问题
客户端到底要将请求发送给哪台服务器
负载均衡问题
如果所有客户端的请求都发送给了服务器1,那么服务器2将没有任何意义
资源优化
客户端发送的请求可能是申请动态资源的,也有申请静态资源,但是都是去Tomcat中获取的
特点
稳定性极强。 7*24小时不间断运行
Nginx提供了非常丰富的配置实例
占用内存小,并发能力强
Nginx与Tomcat的区别
Nginx
是异步多进程处理请求,异步方式意味着多个请求(万级别的)只创建一个进程使用,适合高并发
只能处理静态资源请求,称为http协议服务器
Tomcat
Tomcat是同步多进程处理请求,同步方式意味着1个请求创建一个进程使用,多个请求创建多个进程使用,不适合高并发
不仅可以处理静态资源请求,还可以处理动态资源请求。成为web应用服务器
总结
使用nginx用来接收互联网上大量的高并发请求,之后nginx分发(反向代理)给多台tomcat去处理
Nginx作用
反向代理
正向代理
正向代理服务是由客户端设立的
客户端了解代理服务器和目标服务器都是谁
帮助咱们实现突破访问权限,提高访问的速度,对目标服务器隐藏客户端的ip地址
反向代理
反向代理服务器是配置在服务端的
客户端是不知道访问的到底是哪一台服务器
达到负载均衡,并且可以隐藏服务器真正的ip地址
动静分离
Nginx的并发能力公式
worker_processes * worker_connections / 4 | 2 = Nginx
最终的并发能力动态资源需要/4,静态资源需要/2
最终的并发能力动态资源需要/4,静态资源需要/2
Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应
负载均衡
当每次有用户来访问的时候,nginx服务器先判断哪个真实访问服务器负载最小,分配这个用户去访问这个真实的服务器
Nginx命令
./nginx
启动Nginx
./nginx -s reload
重启Nginx
./nginx -s stop
停止Nginx
安装
安装Nginx
docker-compose.yml
命令行
docker-compose up -d
Nginx配置文件
worker_processes
工作进程数
worker_connections
单个工作进程可以允许同时建立外部连接的数量
include
代表引入一个外部的文件
nginx.conf
修改docker-compose文件
docker-compose.yml
命令行
docker-compose up -d
反向代理
Location映射路径匹配策略
匹配语法
location [ = | ~ | ~* | ^~ ] uri { ... }
参数
=
严格匹配
^~
前缀匹配
~
正则匹配,不区分大小写
~*
正则匹配,区分大小写
不严格匹配
示例
/
匹配A配置
/index.html
匹配B配置
/documents/document.html
匹配C配置
/images/1.gif
匹配D配置
/documents/1.jpg
匹配E配置
练习
基于反向代理访问到Tomcat服务器
docker-compose.yml
config.d/default.conf
动静分离
负载均衡
Nginx支持以下负载均衡策略
轮循
权重
ip_hash
least_conn
fair(第三方)
url_hash(第三方)
轮循方案
docker-compose.yml
default.conf
权重方案
default.conf
ip_hash方案
default.conf
Redis
Redis入门
NoSQL简介
NoSQL概念
Not Only SQL 不仅仅是SQL,通常指的非关系型数据库
数据库分类
关系型数据库
实体与实体之间是有各种关系的
非关系型数据库
实体与实体之间是没有关系的
为什么需要NoSQL
高吞吐量 High Throughput
吞吐量 Throughput
系统在单位时间内可以完成的工作总量
高可升级性 High Scalability
可升级性 Scalability
修改系统提升吞吐量带来的成本,的反面度量
可扩展性 Extensibility
增加新特征的成本,的反面度量
高性能 High Performance
性能 Performance
响应用户的应答时间
Redis的安装与使用
主流的NoSQL产品
Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。官方提供测试数据,50个并发执行10万个请求,读的速度是11万次/s,写的速度是8万次/s
CouchDB 是一个开源的面向文档的数据库管理系统,具有高度可伸缩性,提供了高可用性和高可靠性,CouchDB 是一个 Apache Software Foundation 开源项目
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
Neo4j
Memcache
Docker版本Redis的安装与启动
docker-compose.yml
shell
开启6379端口
Windows版Redis的下载
https://github.com/MSOpenTech/redis/tags
Windows版Redis的安装与启动
Windows版Redis的安装
Windows版的安装及其简单,解压Redis压缩包完成即安装完毕
安装的注意事项
解压的目录不要有中文
目录结构层次不要太深
硬盘空间剩余空间最少要大于你的内存空间,建议20G以上
Redis的目录文件
redis-benchmark.exe
redis的性能测试工具
redis-check-aof.exe
aof文件的检查和修复工具
redis-check-dump.exe
rdb文件的检查和修复工具
redis-cli.exe
client 客户端访问命令
redis-server.exe
服务器启动程序
redis.conf
配置文件,这是个文本文件
Windows版Redis的启动与关闭
启动服务器:直接执行redis-server.exe文件可以了
默认端口号:6379
关闭服务器:直接关闭窗口
Windows版Redis的使用
启动客户端的方式: 直接运行即可
安装Redis到系统服务中
win + R --> 运行:services.msc
打开redis的官方安装文档:RedisService.docx
文档中有如下安装服务和卸载服务的说明
cmd进入到Redis的安装目录下,输入以下命令
redis-server --service-install redis.windows.conf --loglevel verbose
安装完成后,查看系统服务列表(win+r 输入:services.msc),找到redis后右击启动
小结
启动Redis服务器的命令是什么
redis-server
启动Redis客户端的命令是什么
redis-cli
Redis服务器的端口号是多少
6379
Redis数据类型与操作命令
Redis的5种数据类型
redis是一种高级的key-value的存储系统,其中value支持五种数据类型
string
Map 字符串类型
hash
Map 类似于Map,值由键和值组成
list
Map 类似于List,值由多个元素组成,有前后顺序,可以重复
set
Map 类似于Set,值由多个元素组成,无序,不可重复
zset
Map 有序的Set,类于TreeSet,有序,不可重复
注意
键长度不能超过1024,太长可读性低,查询速度也会有影响
不建议太短,可维护性差。如果同名会被覆盖
在企业中通常都有统一的命名规范
字符串类型string
概述
字符串类型是Redis中最为基础的数据存储类型,它在Redis中以二进制保存,没有编码和解码的过程。无论存入的是字符串、整数、浮点类型都会以字符串写入。在Redis中字符串类型的值最多可以容纳的数据长度是512M,这是以后最常用的数据类型
常用命令
【重点】set 键 值
向Redis数据为中添加指定的键和值
【重点】get 键
从数据库中获取指定键的值
【重点】del 键
删除指定的键
mset key value [key value...]
批量添加
mget key [key...]
批量获取
incr key
相加命令(+1)
decr key
相减命令(-1)
incrby key increment
自增指定数量
decrby key increment
自减指定数量
setex key second value
设置值的同时,指定生存时间(每次向Redis中添加数据时,尽量都设置上生存时间)
setnx key value
设置值,如果当前key不存在的话(如果这个key存在,什么事都不做,如果这个key不存在,和set命令一样)
append key value
在key对应的value后,追加内容
strlen key
查看value字符串的长度
命令演示
加一个键为company,值为future-weaver
set company future-weaver
再设置一个键为company,值为rainbow-weaver
set company rainbow-weaver
得到company的元素
get company
删除company元素
del company
再次删除company看返回值是否相同
del company
得到company看返回值是多少
get company
哈希类型hash
概述
Redis中的Hash类型可以看成是键和值都是String类型的Map容器,每一个Hash可以存储4G个键值对。
所以该类型非常适合于存储对象的信息。如一个用户有姓名,密码,年龄等信息,则可以有username、password和age等键
所以该类型非常适合于存储对象的信息。如一个用户有姓名,密码,年龄等信息,则可以有username、password和age等键
常用命令
【重点】hset 键 字段 值
添加一个hash类型的键值对,值有字段和值
【重点】hget 键 字段
通过键,字段得到一个值,如:hget user age
【重点】hmset 键 字段 值 字段 值 ...
multiple 同时添加多个字段和值到某个键中
【重点】hmget 键 字段 字段 ...
指定键和多个字段,同时取出多个值
【重点】hdel 键 字段 字段
指定键和字段,删除一个或多个值
【重点】hgetall 键
得到指定键的所有字段和值
hincrby key field increment
自增(指定自增的值)
hsetnx key field value
设置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hexists key field
检查field是否存在
hkeys key
获取当前hash结构中的全部field
hvals key
获取当前hash结构中的全部value
hlen key
获取当前hash结构中field的数量
命令演示
创建hash类型的键为user,并且添加一个字段为username,值为future-weaver
hset user username future-weaver
向user中添加字段为password,值为12345
hset user password 12345
向user中添加字段为age,值为18
hset user age 18
分别得到user中的username、password和age的字段值
hget user username
hget user password
hget user age
hget user password
hget user age
向user中同时添加多个字段和值,birthday 2018-01-01 gender male
hmset user birthday 2018-01-01 gender male
同时取得多个字段:age 和 gender
hmget user age gender
得到user中所有的字段和值
hgetall user
删除user中的生日和密码字段
hdel user birthday password
列表类型list
概述
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部(left)和右部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4G个
常用命令
【重点】lpush 键 元素 元素
从左边添加1个或多个元素
【重点】rpush 键 元素 元素
从右边添加1个或多个元素
【重点】lpop 键
从左边删除一个元素,返回被删除的元素
【重点】rpop 键
从右边删除一个元素,返回被删除的元素
【重点】lrange 键 开始 结束
指定开始和结束的索引,查询多个元素。 从左边数起是从0开始,从右边数起从-1开始 如果查询列表中所有元素,从0到-1就可以了
【重点】llen 键
查询列表中元素的长度
【重点】LSET KEY_NAME INDEX VALUE
通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误
【重点】LREM key count VALUE
根据参数 COUNT 的值,移除列表中与参VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值
lpushx key value
存储数据(如果key不存在,什么事都不做,如果key存在,但是不是list结构,什么都不做)
lindex key index
获取指定索引位置的数据
ltrim key start stop
保留列表中的数据(保留你指定索引范围内的数据,超过整个索引范围被移除掉)
rpoplpush list1 list2
将一个列表中最后的一个数据,插入到另外一个列表的头部位置
命令演示
向mylist键的列表中,从左边添加a b c三个元素
lpush mylist a b c
从右边添加one two three三个元素
rpush mylist one two three
查询所有的元素
lrange mylist 0 -1
从右边添加一个重复的元素three
rpush mylist three
删除最右边的元素three
rpop mylist
删除最左边的元素c
lpop mylist
获取列表中元素的个数
llen mylist
集合类型set
概述
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作
Set可包含的最大元素数量是4G,和List类型不同的是,Set集合中不允许出现重复的元素
常用命令
【重点】sadd 键 元素 元素
向set中添加一个或多个元素
【重点】smembers 键
查询指定键和所有元素
【重点】sismember 键 元素
判断指定的元素是否存在set中,如果存在返回1,否则返回0
【重点】srem 键 元素 元素
删除集合中一个或多个元素
spop key [count]
随机获取一个数据(获取的同时,移除数据,count默认为1,代表弹出数据的数量)
sinter set1 set2 ...
交集(取多个set集合交集)
sunion set1 set2 ...
并集(获取全部集合中的数据)
sdiff set1 set2 ...
差集(获取多个集合中不一样的数据)
命令演示
向myset集合中添加A B C 1 2 3 六个元素
sadd myset A B C 1 2 3
再向myset中添加B元素,看能否添加成功
sadd myset B
显示所有的成员,发现与添加的元素顺序不同,元素是无序的
smembers myset
删除其中的C这个元素,再查看结果
srem myset C
smember myset
smember myset
判断A是否在myset集合中
sismember myset A
判断D是否在myset集合中
sismember myset D
有序集合zset
概述
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。它用来保存需要排序的数据。例如排行榜,一个班的语文成绩,一个公司的员工工资,一个论坛的帖子等。有序集合中,每个元素都带有score(权重),以此来对元素进行排序。它有三个元素:key、member和score。以语文成绩为例,key是考试名称(期中考试、期末考试等),member是学生名字,score是成绩
有序集合有两大基本用途:排序和聚合
常用命令
【重点】zadd key score1 member1 score2 member2 ...
添加一个或多个成员
【重点】zcard key
获取有序集合的成员数
【重点】zrange key start stop
通过索引区间返回有序集合成指定区间内的成员
【重点】zrange key start stop withscores
通过索引区间返回有序集合成指定区间内的成员【升序排列】
【重点】zrevrange key start stop [withscores]
通过索引区间返回有序集合成指定区间内的成员【降序排列】
【重点】zrem key member [member1 ... ]
移除有序集合中的一个或多个成员
zincrby key increment member
修改member的分数(如果member是存在于key中的,正常增加分数,如果memeber不存在,这个命令就相当于zadd)
zscore key member
查看指定的member的分数
zrangebyscore key min max [withscores] [limit offset count]
根据分数的返回去获取member(withscores代表同时返回score,添加limit,就和MySQL中一样,如果不希望等于min或者max的值被查询出来可以采用 (‘分数’ 相当于 < 但是不等于的方式,最大值和最小值使用+inf和-inf来标识)
zrangebyscore key max min [withscores] [limit offset count]
根据分数的返回去获取member(withscores代表同时返回score,添加limit,就和MySQL中一样)
命令演示
向stuScores有序集合中添加zhangsan成员,成绩为60; lisi成员,成绩为2; wangwu成员,成绩为90
zadd stuScores 60 zhangsan 2 lisi 90 wangwu
获取stuScores有序集合中所有的成员
zrange stuScores 0 -1
获取stuScores有序集合中所有的成员及分数
zrange stuScore 0 -1 withscores
倒序获取stuScores有序集合中所有的成员及分数
zrevrange stuScores 0 -1 withscores
获取stuScores有序集合中的成员个数
zcard stuScores
移除stuScores有序集合中的lisi成员
zrem stuScores lisi
Redis通用命令
常用命令
【重点】keys 匹配字符
查询数据库中有哪些键,支持以下两个通配符 *匹配多个字符; ? 匹配1个字符
【重点】del 键1 键2
删除一个或多个键,键可以是任意的类型
【重点】exists 键
判断指定的键是否存在
【重点】type 键
判断指定的键是什么类型,返回字符串类型名
【重点】select 数据库编号
选择数据库,编号0-15
【重点】move 键 数据库编号
将指定的键移动到指定的数据库中
expire key second
设置key的生存时间,单位为秒,设置还能活多久
pexpire key milliseconds
设置key的生存时间,单位为毫秒,设置还能活多久
expireat key timestamp
设置key的生存时间,单位为秒,设置能活到什么时间点
pexpireat key milliseconds
设置key的生存时间,单位为毫秒,设置能活到什么时间点
ttl key
查看key的剩余生存时间,单位为秒(-2 - 当前key不存在,-1 - 当前key没有设置生存时间,具体剩余的生存时间)
pttl key
查看key的剩余生存时间,单位为毫秒(-2 - 当前key不存在,-1 - 当前key没有设置生存时间,具体剩余的生存时间)
persist key
移除key的生存时间(1 - 移除成功,0 - key不存在生存时间,key不存在)
flushdb
清空当前所在的数据库
flushall
清空全部数据库
dbsize
查看当前数据库中有多少个key
lastsave
查看最后一次操作的时间
monitor
实时监控Redis服务接收到的命令
命令演示
添加字符串name的值为zhangsan
set name zhangsan
显示所有的键
keys *
显示所有以my开头的键
keys my*
显示所有my后面有三个字符的键
keys my???
添加一个字符串:name2 lisi
set name2 lisi
添加一个list:name3 a b c d
rpush name3 a b c d
显示所有的键
keys *
一次删除name2和name3这两个键,其中name2和name3是不同的类型,显示所有键
del name2 name3
分别判断name和name2是否存在
exists name
exists name2
exists name2
分别判断name user myset mylist分别是什么类型
type name
type user
type myset
type mylist
type user
type myset
type mylist
切换数据库到15,向15中添加一个name2 wangwu,得到name2的值显示
select 15
set name2 wangwu
get name2
set name2 wangwu
get name2
将15中的name2移到0中
move name2 0
切换到数据库0,显示所有的键
select 0
keys *
keys *
Jedis
Jedis的介绍
Redis不仅可以使用命令来操作,现在基本上主流的语言都有API支持,比如Java、C#、C++、PHP、Node.js、Go等。在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis等其中官方推荐使用Jedis和Redisson
使用Jedis操作redis需要导入jar包如下
commons-pool2-2.3.jar
jedis-2.7.0.jar
junit-4.12.jar
hamcrest-core-1.3.jar
Jedis快速入门
需求
使用Jedis上面的方法来访问Redis,向服务器中写入字符串和list类型,并且取出打印控制台上
分析
创建Jedis对象,指定服务器地址和端口号
向服务器写入
set字符串类型的数据,person=张三
lpush添加list类型的数据,cities=珠海,深圳,广州
从服务器中读取上面的数据打印输出
get得到字符串的值
lrange得到list所有的列表元素
关闭Jedis对象,释放资源
通过客户端查看数据库中是否有数据
代码
JedisTester
Jedis连接池
概述
Jedis连接资源的创建与销毁是很消耗程序性能,所以Jedis为我们提供了Jedis的连接池技术,Jedis连接池在创建时初始化一些连接对象存储到连接池中,使用Jedis连接资源时不需要自己创建Jedis对象,而是从连接池中获取一个资源进行Redis的操作。使用完毕后,不需要销毁该Jedis连接资源,而是将该资源归还给连接池,供其他请求使用
API
JedisPoolConfig配置类
JedisPoolConfig()
通过构造方法创建一个连接池配置对象
void setMaxTotal()
设置连接池中最大连接数
void setMaxWaitMillis()
设置连接池中得到连接的最长等待时间
JedisPool连接池类
JedisPool(配置对象,服务器名,端口号)
通过构造方法创建连接池 参数1:上面配置对象 参数2:服务器名或IP地址 参数3:端口号6379
Jedis getResource()
从连接池中得到一个连接对象
void close()
关闭连接池,通常不关闭
需求
使用连接池优化jedis操作,从连接池中得到一个创建好的Jeids对象,并且使用这个Jedis对象。向Redis数据库写入一个set集合,并且取出集合。打印到控制台,并且查看数据库中信息
分析
创建连接池配置对象,设置最大连接数10,设置用户最大等待时间2000毫秒
通过配置对象做为参数,创建连接池对象
从连接池里面获取jedis连接对象,执行redis命令
执行redis命令sadd写入set集合类型的数据:students=白骨精,孙悟空,猪八戒
执行redis命令smembers读取集合中的数据
输出读取的数据
关闭连接对象(通常连接池不关闭)
代码
pipeline管道
案例
修改综合练习,使其优先从Redis中查询数据
添加依赖
jedis-2.7.0.jar
commons-pool2-2.3.jar
jackson-annotation-2.9.0.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar
commons-pool2-2.3.jar
jackson-annotation-2.9.0.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar
编写jedis.properties
编写JedisUtil
修改ContactInfo实体类
为ContactInfo的getAge、setFormatBirthday、getFormatBirthday方法,添加JsonIgnore注解
编写ContactInfoJedisDAO
修改ContactInfoService
Redis进阶
准备工作
修改yml文件,以方便后期修改Redis配置信息
Redis的AUTH
设置方式一
准备配置文件
下载redis源码,导出配置文件
https://download.redis.io/redis-stable/redis.conf
修改配置文件
requirepass redispass #密码
bind 127.0.0.1 #注释掉
修改docker-compose
设置方式二
在不修改redis.conf文件的前提下,在第一次链接Redis时,输入命令:Config set requirepass 密码
后续向再次操作Redis时,需要先AUTH做一下校验
连接方式
redis-cli:在输入正常命令之前,先输入auth 密码即可
图形化界面:在连接Redis的信息中添加上验证的密码
Jedis客户端
jedis.auth(password);
使用JedisPool的方式
// 使用当前有参构造设置密码
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,int timeout, final String password)
Redis的事务
Redis的事务:一次事务操作,该成功的成功,该失败的失败
先开启事务,执行一些列的命令,但是命令不会立即执行,会被放在一个队列中,如果你执行事务,那么这个队列中的命令全部执行,如果取消了事务,一个队列中的命令全部作废
开启事务:multi
输入要执行的命令:被放入到一个队列中
执行事务:exec
取消事务:discard
输入要执行的命令:被放入到一个队列中
执行事务:exec
取消事务:discard
Redis的事务向发挥功能,需要配置watch监听机制
在开启事务之前,先通过watch命令去监听一个或多个key,在开启事务之后,如果有其他客户端修改了我监听的key,事务会自动取消
如果执行了事务,或者取消了事务,watch监听自动消除,一般不需要手动执行unwatch
Redis持久化
问:把客户端和服务端都关闭了,再重新开启服务器和客户端,数据会不会丢失?
答:会部分丢失,因为在默认的情况下,服务器是每过一段时间保存到硬盘一次
Redis持久化概述
什么是Redis的持久化
将内存中的数据写到硬盘上永久的保存下来,称为持久化
Redis持久化的四种方式
RDB (Redis DataBase )这是Redis默认的持久化方式,数据以二进制的方式保存
RDB文件的内容
二进制数据
AOF (Append Only File)以日志的方式,文本文件的方式保存用户的所有操作
日志文件的内容
set name zhangsan
set name lisi
set name lisi
AOF 重写机制
auto-aof-rewrite-percentage 100 # 指当前aof文件比上次重写的增长比例大小,达到这个大小就进行 aof 重写
auto-aof-rewrite-min-size 64mb # 最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了
Redis 4.0 混合持久化
依赖于AOF的重写机制
在重写时,将数据填充到RDB中
能够保证
RDB文件较小
最新的数据保存在AOF中
RDB持久化机制
优点
方便备份与恢复
整个Redis数据库将只包含一个文件,默认是dump.rdb,这对于文件备份和恢复而言是非常完美的。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。一旦系统出现灾难性故障,我们可以非常容易的进行恢复
性能最大化
对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是分叉出子进程,由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了
启动效率更高
相比于AOF机制,如果数据集很大,RDB的启动效率会更高
缺点
不能完全避免数据丢失
因为RDB是每隔一段时间写入数据,所以系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失
会导致服务器暂停的现象
由于RDB是通过子进程来协助完成数据持久化工作的,因此当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。一般在夜深人静的时候持久化会比较好
RDB持久化机制的配置
在redis.conf配置文件中的SNAPSHOTTING中有如下说明
save <时间间隔> <修改键数>
每过多久,修改了多少个键,则进行持久化。必须两个条件同时满足
如下面配置的是RDB方式数据持久化时机,必须两个条件都满足的情况下才进行持久化的操作
save 900 1
15分钟内修改了1个键
save 300 10
5分钟内修改了10个键
save 60 10000
1分钟内修改了1万个键
操作演示
给redis.conf添加一个行save 20 3
启动容器
修改两个键,观察data目录,dump.rdb是否被刷新
没被刷新,原因是20秒、3次没被触发
在20秒以内,修改第3个键,观察data目录,dump.rdb是否被刷新
被刷新了
重新启动容器,观察redis内部的文件是否被恢复了
被恢复了,因为存在了一个dump.rdb的文件,redis在启动时会找这个文件,找到了就恢复,找不到就不恢复(空的)
关闭容器,删除dump.rdb,启动容器,并观察是否有数据被恢复
没有数据被恢复
AOF持久化机制
优点
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。也可以通过该文件完成数据的重建。该机制可以带来更高的数据安全性,所有的操作都是异步完成的
Redis中提供了3种同步策略
每秒同步
每过1秒钟就写一次数据
每修改同步
每个修改就写一次数据
不同步
默认没有打开,不持久化
缺点
文件比RDB更大:对于相同数量的数据集而言,AOF文件通常要大于RDB文件
运行效率比RDB更慢:根据同步策略的不同,AOF在运行效率上往往会慢于RDB
AOF持久化机制配置
开启AOF持久化
AOF默认是关闭的,首先需要开启AOF模式
appendonly no/yes
如果要开启,设置为yes。如果设置成yes,就会在硬盘上生成一文本文件 生成文件:appendonly.aof
AOF持久化时机
appendfsync everysec
每秒同步
appendfsync always
每修改同步
appendfsync no
不同步
演示
打开AOF的配置,找到APPEND ONLY MODE配置块,1094行。设置appendonly yes
通过redis-server redis.windows.conf 启动服务器,在服务器目录下出现appendonly.aof文件。大小是0个字节
添加3个键和值
打开appendonly.aof文件,查看文件的变化。会发现文件记录了所有操作的过程
小结
RDB
二进制
子进程
基于时间和次数
同步
AOF
文件文档
3种不同策略,一般用每次
异步
AOF是把所有的变更存储在了基于文本的文档当中
RDB是把所有的变更存储在了二进制文件当中
Redis的主从架构
指定yml文件
# redis2和redis3从节点配置
replicaof master 6379
# redis-cli内查看节点信息
info
哨兵
哨兵可以帮助我们解决主从架构中的单点故障问题
修改了以下docker-compose.yml,为了可以在容器内部使用哨兵的配置
准备哨兵的配置文件,并且在容器内部手动启动哨兵即可
在Redis容器内部启动sentinel即可
redis-sentinel sentinel.conf
Redis的集群
Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储数据的能力
准备yml文件
配置文件
启动了6个Redis的节点。
随便跳转到一个容器内部,使用redis-cli管理集群
随便跳转到一个容器内部,使用redis-cli管理集群
redis-cli --cluster create 192.168.56.1:7001 192.168.56.1:7002 192.168.56.1:7003 192.168.56.1:7004 192.168.56.1:7005 192.168.56.1:7006 --cluster-replicas 1
Java连接Redis集群
使用JedisCluster对象连接Redis集群
Redis常见问题【重点】
key的生存时间到了,Redis会立即删除吗?
redis并不会实时监控
不会立即删除
定期删除:Redis每隔一段时间就去会去查看Redis设置了过期时间的key,会再100ms的间隔中默认查看3个key
惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,直接删除当前key,并且给用户返回一个空值
Redis的淘汰机制
在Redis内存已经满的时候,添加了一个新的数据,执行淘汰机制
volatile-lru:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少使用的key
allkeys-lru:在内存不足时,Redis会再全部的key中干掉一个最近最少使用的key
volatile-lfu:在内存不足时,Redis会再设置过了生存时间的key中干掉一个最近最少频次使用的key
allkeys-lfu:在内存不足时,Redis会再全部的key中干掉一个最近最少频次使用的key
volatile-random:在内存不足时,Redis会再设置过了生存时间的key中随机干掉一个
allkeys-random:在内存不足时,Redis会再全部的key中随机干掉一个
volatile-ttl:在内存不足时,Redis会再设置过了生存时间的key中干掉一个剩余生存时间最少的key
noeviction:(默认)在内存不足时,直接报错
缓存的常见问题
缓存穿透问题
原因
查询的数据,Redis中没有,数据库中也没有
解决
根据id查询时,如果id是自增的,将id的最大值放到Redis中,在查询数据库之前,直接比较一下id
如果id不是整型,可以将全部id放到set中,在用户查询之前,去set中查看一下是否有一个id
获取客户端的ip地址,可以将ip的访问添加限制
缓存击穿问题
原因
缓存中的热点数据,突然到期了,造成了大量的请求都去访问数据库,造成数据库宕机
解决
在访问缓存中没有的时候,直接添加一个锁,让几个请求去访问数据库,避免数据库宕机
热点数据的生存时间去掉(不推荐)
缓存雪崩问题
原因
当大量缓存同时到期时,最终大量的请求同时去访问数据,导致数据库宕机
解决
将缓存中的数据的生存时间,设置为30~60的一个随机时间
缓存倾斜问题
原因
热点数据放在了一个Redis节点上,导致Redis节点无法承受大量的请求,最终Redis宕机
解决
扩展主从架构,搭建大量的从节点,缓解Redis的压力
可以在Tomcat中做JVM缓存,在查询Redis之前,先去查询Tomcat中的缓存
spring-data-redis
导入依赖
spring-boot-starter-data-redis
配置
application.yml
RedisTemplate泛型自动注入
RedisTemplate开启pipeline
ElasticSearch
概述
使用Java编写,基于Lucene的: 搜索引擎框架
倒排索引
根据内容查询id
全文检索
在海量数据中执行搜索功能时,如果使用MySQL,效率太低
高亮显示
将搜索关键字,以不同的样式展示
ElasticSearch的结构
索引,分片和备份
Index, 类似于MySQL中的库
每一个索引默认被分成5片存储
每一个分片都会存在至少一个备份分片
备份分片默认不会帮助检索数据,当ES检索压力特别大的时候,备份分片才会帮助检索数据
备份的分片必须放在不同的服务器中
类型
Type,类似于MySQL中的表 ES 6.0或以前,一个Index可以有多个Type ES 6.x,一个Index只能有一个Type ES 7.x,取消了Type的概念
文档
Document,类似于MySQL中的记录、行
字段
Field,类似于MySQL中的字段
字段类型
字符串类型
text
一般用于全文检索。 将Field分词
keyword
不会被分词
数值类型
long
取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次方-1),占用8个字节
integer
取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节
short
取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节
byte
取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节
double
1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节
float
3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节
half_float
精度比float小一半
scaled_float
根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45
时间类型
date
针对时间类型指定具体的格式
布尔类型
boolean
表达true和false
二进制类型
binary
暂时支持Base64 encode string
范围类型
赋值时,无需指定具体的内容,用于存储一个范围,可以指定gt,lt,gte,lte
long_range
integer_range
double_range
float_range
date_range
ip_range
经纬度类型
geo_point
ip类型
ip
可以存储IPV4或者IPV6
安装
启动容器
docker-compose.yml
安装ik分词器
在线安装
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip
离线安装
bin/elasticsearch-plugin install file:///usr/share/elasticsearch/download/elasticsearch-analysis-ik-7.9.3.zip
重启容器
docker-compose restart
基本操作
索引操作
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html
分词
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html
ik_smart
粗粒度拆分
ik_max_word
细粒度拆分
创建索引
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
创建空索引
number_of_shards
分片数
number_of_replicas
备份数
创建索引,同时定义字段
type
指定类型
analyzer
指定分词器
index
是否参与索引
store
是否持久化
format
时间类型格式
删除索引
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html
DELETE /person
查看索引
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-index.html
GET /person
GET /_cat/aliases
GET /_cat/aliases
文档操作
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
创建文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html
自动生成_id
手动指定_id
查看文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html
GET /book/_doc/1
删除文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html
DELETE /book/_doc/1
根据检索删除文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html
数据准备
商品索引
短信索引
汽车索引
Kibana查看索引信息
左上角菜单栏
Stack Management
Index Management
检索
全量检索【重点】
match all
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-all-query.html
查询全部内容,不指定任何查询条件
精准检索
Term-level queries
ids【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html
根据多个id查询
term【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
完全匹配查询
terms【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html
完全匹配查询
range【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
范围查询,只针对数值类型
gt: >
gte: >=
lt: <
lte: <=
prefix【性能差】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html
前缀查询
fuzzy【性能差】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
模糊查询
prefix_length
指定前面几个字符是不允许出现错误的
wildcard【性能差】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
通配符查询
*
?
regexp【性能差】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html
正则查询
全文检索
Full text queries
全文检索属于高级查询,会根据查询字段的类型,采用不同的查询方式
match【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html
指定一个Field作为筛选的条件
query
检索关键字
prefix_length
operator
OR (Default)
AND
multi-match
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
指定多个Field作为筛选的条件
复合检索
Compound queries
boolean【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
将多个查询条件,以一定的逻辑复合在一起
参数
must
所有的条件,用must组合在一起,表示And的意思
must_not
将must_not中的条件,全部都不能匹配,标识Not的意思
should
所有的条件,用should组合在一起,表示Or的意思
示例
查询省份为武汉或者北京
运营商不是联通
信息内容包含中国和平安
运营商不是联通
信息内容包含中国和平安
boosting【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html
影响查询后的score
positive
只有匹配上positive的查询的内容,才会被放到返回的结果集中
negative
如果匹配上和positive并且也匹配上了negative,就可以降低这样的文档score
negative_boost
指定系数,必须小于1.0
检索时,分数是如何计算的
搜索的关键字在文档中出现的次数越多,分数越高
指定的文档内容越短,分数越高
检索时,指定的关键字也会被分词,分词后的内容,被分词库匹配的次数越多,分数越高
示例
聚合检索
Aggregations
引言
聚合能够得到一个数据的概览。能够分析和总结全套的数据,而不是寻找单个文档
在大海里有多少针?
针的平均长度是多少?
按照针的制造商来划分,针的长度平均值是多少?
每月加入到海中的针有多少?
聚合也可以回答更加细微的问题
最受欢迎的针的制造商是什么?
这里面有异常的针么?
要掌握聚合,需要明白两个主要的概念
桶(Buckets)
满足特定条件的文档的集合
指标/度量(Metrics)
对桶内的文档进行统计计算
每个聚合都是桶和指标的组合。翻译成粗略的SQL语句来解释
SELECT COUNT(color)
FROM table
GROUP BY color
COUNT(color) 相当于指标
GROUP BY color 相当于桶
桶在概念上类似于 SQL 的分组(GROUP BY),而指标则类似于 COUNT() 、 SUM() 、 MAX() 等统计方法
桶聚合
Buckets aggregation
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html
Terms aggregation【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html
按照汽车颜色color划分桶
Histogram aggregation【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-histogram-aggregation.html
阶梯分桶
对汽车的价格进行分组,指定间隔interval为5000
Range aggregation【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-range-aggregation.html
统计一定范围内出现的文档个数
数值范围统计
时间范围统计
ip范围统计
度量聚合
Metrics aggregation
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics.html
avg【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-avg-aggregation.html
平均值度量
按照汽车颜色color划分桶,求价格平均值
cardinality【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html
去重计数
extended stats【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-extendedstats-aggregation.html
查询指定Field的最大值,最小值,平均值,平方和等
嵌套聚合【重点】
过滤检索
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
Query and filter context
query
根据查询条件,计算文档的匹配度得到一个分数,根据分数排序,不做缓存处理
filter
根据查询条件查询文档,不计算分数,会对经常过滤的数据做缓存处理
经纬度检索
Geo queries
geo-distance【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html
距离搜索
location
确定一个点
distance
确定半径
distance_type
指定形状为圆形
geo-bounding box【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html
方形搜索
top_left
左上角
bottom_right
右下角
geo-polygon【了解】
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-polygon-query.html
多边形搜索
points
指定多个点,确定一个多边形
根据检索删除文档
<https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html>
检索深入
高亮查询【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html
Highlighting
将关键字,以一定的特殊样式展示给用户
fragment_size
指定高亮数据展示多少个字符回来
pre_tags
指定前缀
post_tags
指定后缀
fields
指定哪几个Field以高亮形式返回
分页查询【重点】
https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
Paginate search results
深分页【重点】
ES对from + size是有限制的,from和size二者之和不能超过1W
原理
from+size在ES查询数据的方式
第一步现将用户指定的关键进行分词。 第二步将词汇去分词库中进行检索,得到多个文档的id。 第三步去各个分片中去拉取指定的数据。耗时较长。 第四步将数据根据score进行排序。耗时较长。 第五步根据from的值,将查询到的数据舍弃一部分。 第六步返回结果
scroll+size在ES查询数据的方式
第一步现将用户指定的关键进行分词。 第二步将词汇去分词库中进行检索,得到多个文档的id。 第三步将文档的id存放在一个ES的上下文中。 第四步根据你指定的size的个数去ES中检索指定个数的数据,拿完数据的文档id,会从上下文中移除。 第五步如果需要下一页数据,直接去ES的上下文中,找后续内容。 第六步循环第四步和第五步
深分页,不适合做实时查询
建立深分页
https://www.elastic.co/guide/en/elasticsearch/reference/current/scroll-api.html
查询缓存分页数据
scroll
默认情况下,不会超过id
清除缓存分页数据
https://www.elastic.co/guide/en/elasticsearch/reference/current/clear-scroll-api.html
Spring Data Elasticsearch
https://spring.io/projects/spring-data#overview
Spring Data
Spring Data Elasticsearch是Spring Data项目下的一个子模块
Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性
它使得使用数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务变得容易。这是一个总括项目,其中包含许多特定于给定数据库的子项目。这些令人兴奋的技术项目背后,是由许多公司和开发人员合作开发的
Spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率
Spring Data Elasticsearch
支持Spring的基于@Configuration的java配置方式,或者XML配置方式
提供了用于操作ES的便捷工具类ElasticsearchTemplate。包括实现文档到POJO之间的自动智能映射
利用Spring的数据转换服务实现的功能丰富的对象映射
基于注解的元数据映射方式,而且可扩展以支持更多不同的数据格式
根据持久层接口自动生成对应实现方法,无需人工编写基本操作代码(类似mybatis,根据接口自动得到实现)。当然,也支持人工定制查询
快速入门
导入依赖
spring-boot-starter-data-elasticsearch
编写配置
application.yml
添加Repository注解扫描
编写实体类,添加注解
@Document
用在类,标记实体类为文档对象,一般有四个属性
indexName:对应索引库名称
type:对应在索引库中的类型
shards:分片数量,默认5
replicas:副本数量,默认1
@Id
作用在成员变量,标记一个字段作为id主键
@Field
作用在成员变量,标记为文档的字段,并指定字段映射属性
type:字段类型,取值是枚举:FieldType
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer:分词器名称:ik_max_word
文档操作
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
}
}
新增/修改文档
批量新增文档
查看文档
自定义方法查询
Spring Data 的另一个强大功能,是根据方法名称自动实现功能
比如:方法名做:findByTitle,SpringData会自动根据语义,理解为: 根据title查询,无需实现
常见语法
And
findByNameAndPrice
Or
findByNameOrPrice
Is
findByName
Not
findByNameNot
Between
findByPriceBetween
LessThanEqual
findByPriceLessThan
GreaterThanEqual
findByPriceGreaterThan
Before
findByPriceBefore
After
findByPriceAfter
Like
findByNameLike
StartingWith
findByNameStartingWith
EndingWith
findByNameEndingWith
Contains/Containing
findByNameContaining
In
findByNameIn(Collection<String>names)
NotIn
findByNameNotIn(Collection<String>names)
Near
findByStoreNear
True
findByAvailableTrue
False
findByAvailableFalse
OrderBy
findByAvailableTrueOrderByNameDesc
例如,按照价格区间查询
高级查询
基本查询
自定义查询
NativeSearchQueryBuilder:Spring提供的一个查询条件构建器,帮助构建json格式的请求体
分页查询
排序
聚合
聚合为桶
按照品牌brand进行分组
嵌套聚合,求平均值
RabbitMQ
SpringCloud
0 条评论
下一页