javatree
2021-06-09 19:30:18 2 举报
AI智能生成
java
作者其他创作
大纲/内容
linux
基本命令
ls
-l
-t
-r
-h
-a
查看
cat
more
tail
-n
-f
touch
mkdir
grep
-E
|
egrep
\|
head
find
find /data/docker/* -name *.yaml
df
-h
du
-sh
awk
ps
-ef
-aux
free
free -h -s 3
free -h
挂载磁盘以及设置静态的ip
压缩/解压
tar.gz
压缩
tar -zcvf 目标文件压缩位置 需要压缩的文件
解压
tar -xzvf 需要解压的文件 解压目录
gz
gizp -d 文件名.gz(解压)
网络
telnet
ping
netstat
-a
-r 路由表
-t tcp连接
-u udp连接
route
ifcongig
vim
: set nu 显示行号
:set nonu 隐藏行号
yy 复制一行
P 粘贴到本行
p 粘贴到下一行
dd 删除一行
ndd 删除n行
x 向后删除一个字符
X 项前删除一个字符
/string 向光标之下寻找名称为string的字符串
u 回退,撤销上个操作
【ctrl】+r 重做上一个动作
$或者【end】 移动到本行的最后
0 移动到本行的开始
正则
子主题
子主题
虚拟机连接方式
NAT
桥接模式
框架知识
spring知识
spring
IOC
spring IOC 的实现
AOP
spring AOP 实现
bean
bean的生命周期
事务
spring的事务处理过程
springmvc
spring boot
Spring boot security
原理
组件
spring boot mvc
spring boot webflux
子主题
子主题
子主题
子主题
spring Cloud
eureka
openFeign
gateway
restTemplate
WebClient
spring webflux
spring webflux(计划投入一个月学习)11月31号
基础学习
并发编程
lamdba
stream
jdk9响应式流flux :理解背压和实现机制
reactor = jdk8的stream + jdk9的flow响应式流
认识响应式编程
观察者模式
主题
Subject
观察者
Observer
流式语法
reactor
reactor
响应式类型
Flux
操作符转换序列
映射元素
map(映射元素类似于Stream map)
timestamp (添加操作时间)
index(元素索引)
过滤
filter(过滤满足条件元素)
ignoreElements
takeLast(传参n,返回流的最后n个元素)
takeUntil(传入元素,直到达到条件停止收集响应流数据)
elementAt
single
收集操作
collectSortedList(排序收集)
collectList(收集)
collectMap 一对一
collectMultimap 一对多
子主题
裁剪操作
any
scan
reduce
sort
组合操作
concat
merge
zip
combineLatest
流元素批处理
buffering
根据指定的缓存大小
windowing
grouping
采样
sample
订阅
其他
repeat(循环)
distinct 去重
distinctUntilChanged
Mono
生命周期
组装时
订阅时
运行时
入门使用
WebFlux异步非阻塞通信
webFlux内核
工具
ServerHttpRequest
ServerHttpResponse
ServerWebExchange
接口
WebFilterChain
WebHandler
WebFilter
纯函数式Web
基于WebClient的非阻塞跨服务通信
响应式WebSocket API
作为WebSocket轻量级替代品的响应式SSE
响应式Web安全
响应式数据库访问
使用Cloud Streams提升伸缩性
测试响应式应用程序
最后,发布!
mybatis
编辑器
IDEA
插件
lombok
free Mybatis plus
IdeaVim
VisualVM
JRebel
DataGrip
vscode
设计模式
创建型模式
单例模式
简单工厂模式
工厂模式
抽象工厂模式
建造者模式
原型模式
行为型模式
责任链模式
命令模式
解释器模式
迭代器模式
中介者模式
备忘录模式
观察者模式
状态模式
策略模式
模板方法
访问者模式
空对象
结构型模式
适配器模式
桥接模式
组合模式
装饰器模式
外观模式
享元模式
代理模式
设计原则
单一职责原则
开闭原则
里氏替换原则
接口隔离原则
依赖倒置原则
迪米特原则
docker
docker环境配置
docker容器
docker基础命令
docker search xxx
docker run -d -p 4000:80 nginx
docker logs -f 容器id
docker ps
docker exec -it 镜像id 操作指令个
docker run --network none 禁用容器网络
docker container inspect 容器id 查看容器运行信息
docker中对于网络的操作
Dockerfile的使用
values数据卷的使用
docker-compose
docker-compose up
docker-compose up -d
docker-compose down --rmi all
与传统虚拟机相比优势在哪?
启动速度
秒级
性能
接近原生
内存占用
很小
硬盘使用
一般为MB级
运行密度
单机支持上千个容器
隔离性
安全隔离
迁移性
优秀
java
集合类
Collection
list
ArrayList
LinkedList
set
HashSet
LinkedHashSet
Map
HashMap
线程不安全
实现原理:数组+ Entry链表/红黑树
扩容:初始化长度为16,当前长度为n,每次扩容为2n。(什么情况下会触发扩容:当元素的总个数>当前数组的长度 * 负载因子)
负载因子:0.75
TREEIFY_THRESHOLD 链表树化阙值: 默认值为 8 。表示在一个node(Table)节点下的值的个数大于8时候,会将链表转换成为红黑树。
UNTREEIFY_THRESHOLD 红黑树链化阙值: 默认值为 6 。 表示在进行扩容期间,单个Node节点下的红黑树节点的个数小于6时候,会将红黑树转化成为链表。
MIN_TREEIFY_CAPACITY = 64 最小树化阈值,当Table所有元素超过改值,才会进行树化(为了防止前期阶段频繁扩容和树化过程冲突)。
put/get方法流程?
put
子主题
get
子主题
HashTable
线程安全
实现原理
LinkedHashMap
TreeMap
java基础
面向对象
继承
封装
多态
重写
重载
循环
for
while
do...while
stream
条件判断
if else
switch
数据类型
基本数据类型
byte
short
int
long
float
double
boolean
char
引用类型
String
Array
接口
抽象类
java8
日期类
LocalDateTime
LocalTime
LocalDate
Instant
DateTimeFormatter
lambda
函数式接口
实现原理
StreamAPI
串行
map
filter
peek
mapToxxx
flatMap
flatMapxxx
skip
limit
终止操作
findFirst
xxxMatch
count
min
max
collect
toList
toSet
groupingBy
reduce
并行
同并行
java事件机制
事件
事件监听器
事件源
多线程
synchronized
volatile
locks
原子类
同步集合
socket
AIO
BIO
NIO
selector
BootStarp
客户端的编写
ServerBootStarp
服务端的编写
channel
socket
servlet
listener
filter
Interceptor
JDK
jvm
jvm学习
内存模型
子主题
jvm调优
jstack
jmap
-dump
-histo
jstat
jinfo
juc
学习记录
数据库
关系型数据库
MySql
安装
配置
使用
表
索引
innodb
mylsam
事务
锁
乐观锁
悲观锁
范式
第一范式
第二范式
第三范式
bc范式
函数
PostgreSQL
安装
特殊语法
NoSql
MongoDB
安装
使用
minio
安装
子主题
使用
缓存
redis
redis数据类型
String
Hash
List
Set
Zset
安装/配置
redis应用问题
缓存雪崩
子主题
集群问题
知识点
redis(计划周期三周~四周)11月15号
第一阶段入门
数据结构与对象
各种数据类型底层使用的数据结构
SDS串结构(简单动态字符串)
获取空闲空间长度
O(1)
获取存储值长度
O(1)
常用api
子主题
结构
与字符创区别
不会内存溢出(先判断是否符合修改条件,再进行修改)
获取值长度的时间复杂度为1,保存了值长度信息,可以直接读取
减少修改带来的内存重分配操作
二进制安全(字符串字符结尾如果有空格,会被认为是字符结尾,所以,字符串不能保存二进制数据)
兼容部分C字符串函数
字节数组 + 一个末尾字节容纳空字节
链表
结构
链表结构adlist.h/listNode
如果使用adlist.h/list持有链表,操作更方便
dup 函数用于复制链表节点所保存的值;
free 函数用于释放链表节点所保存的值;
match函数则用于对比链表节点所保存的值和另一个输入值是否相等
特性
双端
带有头指针和尾指针
无环
已null为终点,头指针和尾指针的next都为null
带表头指针和表尾指针
多态
void*指针类型保存节点值,可以保存任何类型,但是使用的时候必须转化成相应的指针类型
带链表长度计数器
获取长度时间复杂度为1
使用
列表键
发步
订阅
慢查询
...
字典(符号表)
实现
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对
字典结构
哈希表
结构
table
数组指针->dictEntry
size
sizemask
used
子主题
要点
哈希算法
哈希冲突
next指针链接冲突的节点
rehash(重哈希)
要点
一个字典会有两个哈希表,一个平时使用,另一个仅用于rehash时使用
哈希表使用链地址法解决哈希冲突问题
跳跃表
概念
通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
优点
跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找
跳跃表的效率可以和平衡树相媲美
实现简单
可替换平衡树
平衡树:任意节点的子树的高度差都小于等于1
使用
有序集合
集群内部结构
结构
跳跃表节点
跳跃表
整数集合
概念: 可以保存 short int long 类型的数据,并可以保证数据不会出现重复
结构
encoding 决定集合存储那种类型的数据
length 整数集合的长度
升级
问题: 需要存放比当前所有值都长的整数时(比如当前数据全为 short 要存int 类型的数据时)
解决方法
根据新元素的类型,扩充整数集合底层数组大小,并未新元素分配空间
转化之前数据未新的数据类型,然后放到正确的位置上,过程需要维持数组的有序性
将新元素添加到底层数组
优点
提升灵活性
节约内存
压缩列表
使用
列表键
哈希键
是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构。一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。
结构
zlbytes
记录整个压缩列表占用的字节树
zltail
记录压缩列表的尾节点到起始位置占用多少个字节
zllen
记录压缩列表中节点的数量
zlend
0xFF 特殊字符,记录压缩列表的长度
entryNode
previous_entry_length
记录前一个节点的长度
encoding
当前节点保存数据的类型及长度
content
当前节点的内容,内容可以字节数组或者整数
连锁更新问题
entry节点中保存有前一个节点的长度,如果添加一个新节点,将会引发连锁的更新操作,删除操作同样回更新
对象
字符串对象
int
数值将会保存在ptr* 中, ptr* 的属性会从void * 变成 long
raw
如果存储的为字符串,并且长度大于32个字节,则会使用SDS字符串保存,并且对象的编码会设置成raw, ptr* 指针会指向SDS存储结构
embstr
使用
如果存储的为字符串,并且长达小于32个字节,则会embstr是专门用于保存短字符串的一种优化编码方式
对比SDS优点
创建对象字符串的所需的内存分配次数由两次降为了一次
释放内存只需调用一次释放内存函数
所有数据保存在一块连续内存,更好的利用缓存的优势
列表对象
底层实现
压缩列表
双向链表
哈希对象
编码方式
hashtable
字典
ziplist
压缩列表
键和值大小都小于64
键值数量小于512
子主题
集合对象
实现
intset
整数集合
所有数据都是整数
数量不超过512个
hashtable
字典
有序集合对象
实现
ziplist
压缩列表
使用连续的两个节点保存数据,一个保存数据,一个保存数据的值信息
skiplist
zset结构(一个字典一个跳表)
子主题
内存回收机制
引用计数方式
结构
type
REDIS_STRING
字符串对象
REDIS_LIST
列表对象
REDIS_HASH
哈希对象
REDIS_SET
集合对象
REDIS_ZSET
有序集合对象
encoding
编码
ptr
指向底层实现的数据结构
命令操作
指定类型键执行
■ SET、GET、APPEND、STRLEN等命令只能对字符串键执行;
■ HDEL、HSET、HGET、HLEN等命令只能对哈希键执行;
■ RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行;
■ SADD、SPOP、SINTER、SCARD等命令只能对集合键执行;
■ ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行;
■ HDEL、HSET、HGET、HLEN等命令只能对哈希键执行;
■ RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行;
■ SADD、SPOP、SINTER、SCARD等命令只能对集合键执行;
■ ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行;
任意键执行
DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等
类型检查
命令多态
对象共享
相同的对象共享现有的值对象(值对象引用计数器加1)
只共享数值类型
为什么不共享复杂的数据类型?
复杂的数据类型比较相对复杂,对于cpu性能考虑,不考虑复杂对象共享
对象空转时长
对象最后一次被操作的时间
单机数据库的实现
数据库
数据库存在形式
默认创建16个
select index 切换数据库
子主题
数据库键空间
键空间使用字典保存数据库中所有键值
操作
添加
删除
更新
取值
其他键空间操作
FLUSHDB 清空数据库
RANDOMKEY 随机返回某个键
EXISTS、RENAME、KEYS等
读写键空间时一起的维护操作
比如读取之后更新LRU 最后读取时间
设置过期时间
EXPIRE命令或者PEXPIRE
■ EXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl秒。
■ PEXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl毫秒。
■ EXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳。
■ PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。
■ PEXPIRE <key> <ttl> 命令用于将键key的生存时间设置为ttl毫秒。
■ EXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳。
■ PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。
TTL或PTTL返回当前键到期时间
保存过期时间
使用字典保存
键保存数据指针
值保存过期时间
移除过期时间
PERSIST 键值
过期键的删除策略
定时删除
创建键的同时创建一个定时器,让定时器在键到期是立即删除
惰性删除
使用expireIfNeeded命令检查,如果过期则删除
定期删除
使用activeExpireCycle函数,定期对数据库expires字典中随机检查一部分键,删除过期的键值
AOF、RDB和复制功能对过期键的处理
RDB
生成
当执行SAVE或者BGSAVE命令新生成RDB文件时,服务器会对所有键进行检查,已经过期的键不会保存到RDB文件中
载入
主服务器
载入RDB文件时,会忽略已经过期的键值
从服务器
无论是否过期都会被载入
AOF
写入
如果过期键没有被删除,不会影响AOF文件,被删除之后会显示的追加一条删除语句
重写
重写时会忽略已经过期的键值
复制
主服务
主服务器控制是否显示删除过期键,然后告知从服务器删除,所以,从服务器不会考虑键是否过期,会把所有键同等对待处理
从服务
同等处理过期键以及未过期键
数据库通知
订阅某个键
某个键执行了什么操作
订阅某个命令
某个命令被哪些键执行
数据的持久化
RDB
SAVE
阻塞进程
阻塞期间服务器不能处理任何命令
BGSAVE
开启一个子进程创建RDB文件
不会影响服务器处理其他指令
载入
redis 会自动检查是否有RDB文件,如果有自动载入,所以没有想管的命令
dirty计数器和lastsave属性
dirty计数器
子主题
上次保存RDB之后到现在文件的修改次数
lastsave属性
lastsave属性
上次执行保存的时间
检查条件是否满足
Redis有周期性函数serverCron每100毫秒就会检查系统设置的save条件是否满足,满足的话执行备份操作
文件结构
REDIS
db_version
RDB 版本号
database
数据库键值对信息(如果包含两个部位空的数据库)
database_0
SELECTDB
标志接下来要读的是数据库号码
db_number
数据库号码
key_value_pairs
数据库中的所有键值对数据
普通键值对
TYPE
键值对的类型
KEY
键名
VALUE
键值
编码
字符串对象
int
对应数值
raw
小于20
直接存值
len
值
大于20
压缩后存储
LZF(表示压缩)
压缩后长度
压缩前长度
压缩后的值
列表对象
列表的长度
列表value1
raw
字符串长度
字符串的值
value2
.........
哈希对象
hash_size
哈希表的长度
key_value_pair
raw
字符串长度
字符串的值
集合对象
raw
字符串长度
字符串的值
有序集合对象
sorted_set_size
集合的长度
element
元素值
元素分值(以字符串形式存储)
raw
字符串长度
字符串的值
带有过期时间的键值对
EXPIRETIME_MS
时间单位
ms
过期时间
TYPE
KEY
VALUE
database_1
EOF
结束符
check_sum
校验和/检查文件是否出现错误
文件分析
查看生成的RDB文件: od -c dump.rdb(空库所含内容)
■ 五个字节的"REDIS"字符串。
■ 四个字节的版本号(db_version)。
■ 一个字节的EOF常量。
■ 八个字节的校验和(check_sum)
■ 四个字节的版本号(db_version)。
■ 一个字节的EOF常量。
■ 八个字节的校验和(check_sum)
子主题
AOF
如果系统开启了AOF ,会优先使用AOF载入
与RDB的区别
RDB是村吃所有的键值对来保存数据
AOF是记录服务器执行的所有命令来记录到AOF文件中,恢复数据库时,重新执行一遍操作命令
持久化实现
命令追加
AOF开启的时候,服务器在执行完一个命令之后,会以协议的格式将命令追加到aof_buf缓冲区
文件写入
并不是所有的命令都会被写入到文件中,比如读命令,服务器在每次执行完一个写命令后,会调用flushAppendOnlyFile判断是否需要写入到文件中
flushAppendOnlyFile函数的行为由服务器配置的appendfsync选项的值来决定
always
everysec(default)
no
文件同步
同步是吧缓冲区的文件同步到AOF文件中
载入与数据还原
因为AOF文件中保存的都是写命令,所以服务器重新执行一下AOF文件中的命令就可以恢复之前的数据库状态,
步骤
创建一个不带网络连接的伪客户端,因为Redis的命令只能在客户端中运行,因为是从AOF文件中读取的命令,所以不需要网络连接
从AOF文件中取一条写命令,
使用伪客户端执行读取的命令
重复上面 取命令和读命令,直到文件结束;
AOF后台重写
后台重写时通关创建一个子线程进行的,这样不会影响父线程继续执行操作命令
问题
父子线程可以避免线程安全问题,但是有可能会产生数据不一致问题。
建立缓冲区,父线程执行完的命令会在缓冲区保存下来
事件
文件事件
文件事件处理器
套接字
I/O多路复用程序
拥有所有的I/O复用程序,每个类型一个文件,程序编译时会自动选择一个效率最高的
文件事件分配器
事件处理器
应答处理器
命令请求处理器
复制处理器
事件的类型
AE_READABLE
读套接字
AE_WRITABLE
写套接字
时间事件
组成
id 全局唯一
when 时间戳
timeProc 时间处理器
类型
定时事件
周期性事件
实现
存储结构
链表
每次时间处理器执行到的时候,会遍历整个集合
serverCron函数
■ 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
■ 清理数据库中的过期键值对。
■ 关闭和清理连接失效的客户端。
■ 尝试进行AOF或RDB持久化操作。
■ 如果服务器是主服务器,那么对从服务器进行定期同步。
■ 如果处于集群模式,对集群进行定期同步和连接测试
■ 清理数据库中的过期键值对。
■ 关闭和清理连接失效的客户端。
■ 尝试进行AOF或RDB持久化操作。
■ 如果服务器是主服务器,那么对从服务器进行定期同步。
■ 如果处于集群模式,对集群进行定期同步和连接测试
事件的调度与执行
客户端
服务端
命令请求执行流程
1)客户端向服务器发送命令请求SET KEY VALUE。
2)服务器接收并处理客户端发来的命令请求SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK。
3)服务器将命令回复OK发送给客户端。
4)客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看。
2)服务器接收并处理客户端发来的命令请求SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK。
3)服务器将命令回复OK发送给客户端。
4)客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看。
发送命令请求
客户端会把命令转换成协议状态,然后通过套接字发送到服务端
读取命令
1)读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面。
2)对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。
3)调用命令执行器,执行客户端指定的命令。
2)对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。
3)调用命令执行器,执行客户端指定的命令。
多机数据库的实现
复制
旧版SLAVEOF
SYNC
命令传播
工作机制
1. 当主节点和副本实例连接良好时,主节点通过向副本发送命令流来使副本保持更新,以便复制由于以下原因而对主节点上发生的数据集产生的影响:客户端写入,密钥已过期或驱逐任何其他更改主数据集的操作。
2. 当主服务器和副本服务器之间的链接断开时,由于网络问题或由于在主服务器或副本服务器中检测到超时,副本服务器将重新连接并尝试进行部分重新同步:这意味着它将尝试仅获取该部件断开期间错过的命令流的大小。
3. 如果无法进行部分重新同步,则副本将要求完全重新同步。这将涉及一个更复杂的过程,在该过程中,主服务器需要创建其所有数据的快照,将其发送到副本,然后在数据集更改时继续发送命令流。
使用机制
复制采用异步复制,复制主服务已经确认的数据
一个主服务可以有多个副服务
副本可以接受其他副本的连接,副本不但可以接受主服务的数据,也可以同步其他副本的信息
可以使用复制来避免让主数据库将整个数据集写入磁盘的成本:一种典型的技术包括配置主数据库redis.conf,以免完全保留到磁盘,然后连接配置为不时保存的副本,或者已启用AOF。但是,必须小心处理此设置,因为重新启动的主服务器将以空数据集开始:如果副本尝试与其同步,则副本也将被清空。
新版SLAVEOF
PSYNC
完全同步
首次同步
部分同步
断线重连同步
组成部分
复制偏移量
复制积压缓冲区
如果缓冲区中存在着偏移量之后的写命令,则执行部分同步,否则执行完整同步
为了安全起见,可以将复制积压缓冲区的大小设为2 * second * write_size_per_second,这样可以保证绝大部分断线情况都能用部分重同步来处理。
至于复制积压缓冲区大小的修改方法,可以参考配置文件中关于repl-backlog-size选项的说明。
至于复制积压缓冲区大小的修改方法,可以参考配置文件中关于repl-backlog-size选项的说明。
服务器运行ID
实现部分同步需要提供服务的运行id给到从服务保存
从服务保存的服务id为当前服务id
部分同步
从服务保存的服务id不是当前服务id
完整同步
实现
设置主服务器的地址和端口
建立套接字连接
从服务器是主服务器的客户端
发送ping 命令
收到回复
继续执行下一步
未收到回复
断开重连
身份验证
masterauth
从服务设置了需要认证
发送端口信息
主服务需要监听的端口信息
同步
在执行同步操作之后,主服务器也会成为从服务器的客户端
命令传播
主服务器一直将自己执行的写命令发送给从服务器;
从服务器一直接收并执行主服务器发来的写命令,就可以保证主从服务器一直保持一致了
心跳检测
命令
REPLCONF ACK
作用
检测连接状态
检测命令丢失
如果命令丢失则重新补发
辅助实现min-slaves选项
设置拒绝执行写命令的条件
命令传播
Sentinel
集群
独立功能的实现
子主题
子主题
子主题
Memcache
安装
基本命令
java使用
时序数据库
infuxdb
安装
配置
子主题
计算机基础
计算机网络
OSI七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
协议
TCP
连接三次握手
UDP
HTTP
ARP
DNS
NAT
ICMP
四层模型
应用层
传输层
IP层
网络接口层
操作系统
进程管理
内存管理
进程调度
数据结构
线性结构
特点
存在唯一一个被称为“第一个”的数据元素
存在唯一一个被称为“最后一个”的数据元素
除第一个元素外,集合中的每一个元素存在唯一一个前驱
除最后一个元素外,集合中的每一个元素存在唯一一个后继
结构
顺序结构
类型
栈
先进后出
队列
先进先出
数组
特点
物理上相邻的存储单元中的存储结构
基本运算
修改
插入
删除
查找
排序
非顺序结构
类型
散列结构
链表
单链表
双链表
循环链表
最后一个节点的指针指向第一个节点的地址
特点
逻辑上相邻的存储单元中的存储结构
数据节点
数据域
指针域
实现线性结构
基本运算
修改
插入
删除
查找
排序
树形结构
普通数(可以有任意多的分支)
二叉树
哈夫曼树(最优二叉树)
平衡二叉树
二叉查找树
红黑树
红黑树:
网状结构
集合结构
算法
概念
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
特性
有穷性、确定性、可行性、输入、输出
要求
正确性、可读性、健壮性、底存储与效率需求
分析
时间复杂、空间复杂、稳定性
基本运算
修改、插入、删除、查找、排序
消息
nginx
正向代理
正向代理:代理的是客户端
反向代理
反向代理:代理的是服务器
websocket
STOPM
子主题
STOMP
EMQX
Traeflk
消息队列
rabbitMQ
安装
docker安装
原理
基础组件
架构
使用
子主题
高阶
rabbitmq(计划学习两周)完成10月23 号
概念
生产者消费者
product(生产者)
consumer(消费者)
broker(消息服务节点)
队列
交换器
fanout
direct
topic
headers
声明参数
exchange
交换器的名称
type
交换器的类型
durable
是否持久化
autoDelete
是否自动删除
arguments
用于设置其他的结构话参数
internal
是否为内置交换器
路由键
绑定键
connection
channel
消息队列
类型
点对点
订阅/发步
作用
解耦(各个应用之间解耦)
沉余数据
易扩展(只需添加扩展操作)
削峰
可恢复性
顺序保证
缓冲
异步通信
特点
子主题
amqp协议
概念
异步消息传递所使用的应用层协议规范
组件
生产者
交换器
消息队列
消费者
协议三层
Module layer
Session layer
Transport layer
使用过程
生产者
消费者
安装
入门集成使用
消息队列消息处理机制
消息流向
mandatory 参数
备份交换器
过期时间(TTL)
队列设置过期时间
消息设置过期时间
死信队列
死信队列:用于存放无法被消费的消息
条件
通过设置死信交换器,把相关消息路由到死信队列
延迟队列
概念
rabbitMQ 队列可以实现延迟队列的效果,使用TTL配合死信队列,当队列消息到期之后会投递到死信队列,然后操作死信队列中的消息,实现延迟队列的效果。
实现
过期时间(TTL)
死信队列
优先级队列
概念
队列中的消息拥有优先级,使得消息的消费的时候优先被消费
实现
设置队列最大优先级
生产者添加消息时指定消息的优先级
RPC实现
利用消息队列实现远程调用
持久化
交换器
durable参数设置为true
队列
durable参数设置为true
消息
BasicProperties中deliveryMode设置为2
生产者确认
事务机制
实现
关键步骤
开启事务
提交事务
回滚事务
发送方确认机制
单条确认
批量确认
异步确认
消息消费模式
push
pull
消费者端点
消息分发
轮询方式
解决(basicQos)
prefetchCount
global
消息的顺序
QueueingConsumer
OOM问题
QPS解决
拖累同一个连接下的所有信道
同步递归调用QueueingConsumer死锁问题
......
消费者传输报障
报障等级
最多一次
最少一次
恰好一次
消费者确认
basicAck()
问题
重复消费
........
消息追踪
Firehose
rabbitmq_tracing
镜像队列
rabbitqMQ高阶知识
存储机制
流控
多协议支持
rabbitMQ管理(运维)
管理
多租户与权限
vhost
rabbitmqctl add_vhost [vhostl ] 新增
rabbitmqctl list_vhosts [vhostinfoitem...] 展示vhost信息
name
tracing
rabbitmqctl delete_vhost [vhost] 删除命令
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read} 授予权限
vhost
user
conf
write
read
rabbitmqctl list_permissions [-p vhost] 显示虚拟主机的权限
rabbitmqctl list_user_permissions {username} 显示用户的权限
用户
rabbitmqctl add_user {username} {password} 添加用户
username(用户名)
password(密码)
rabbitmqctl change_password {username} {newpassword} 修改密码
rabbitmqctl clear_password {username} 清除密码
rabbitmqctl authentiçate_user {userηame} {password} 验证用户是否可用密码登录
rabbitmqctl delete_user {username} 删除用户
rabbitmqctl list_users 查询用户列表
tags 权限信息
none
management
policymaker
monitoring
administartor
web界面
RabbitMQ Management
应用与集群管理
应用
rabbitmqctl stop [pid_file] 停止应用
rabbitmqctl shutdown 停止服务
rabbitmqctl stop_ app 停止服务,但虚拟机还在运行
rabbitmqctl reset 节点重置还原为最初状态
........
集群
运维
集群搭建
服务日志
日志查看
子主题
应用场景分析(什么场景下使用?如何使用?)
为什么用?
使用解决的问题
异步通信
削峰
应用解耦
缺陷
系统复杂性
数据一致性
系统可用性
消息队列问题以及解决方案
信道异常关闭
错误信息
解决:注意错误信息:no exchange 'topic002'
自身缺陷
系统可用性
数据一致性
系统复杂性增加
增加消息队列
处理消息队列带来的问题
幂等性
消息顺序执行
高可用性
消息的可靠性传输
生产问题
大量消息在mq里积压
消息队列过期失效问题
队列积压满了
消息队列优化
子主题
子主题
集群
子主题
子主题
扩展
子主题
子主题
云
0 条评论
下一页